我有一个从PostgreSQL数据库获取CSV文件的CLI应用程序.尽管运行代码会创建CSV文件并将数据放入CSV,但通过docker compose运行应用程序并不会这样做.

我把音量放到了app服务中,但它不起作用.

Docker compose file

version: "3.8"
services:
  app:
    build:
      context: .
      dockerfile: Dockerfile
    command: sh -c "while true; do echo 'App is running'; sleep 10; done"
    environment:
      POSTGRES_HOST: postgres
      POSTGRES_USER: postgres
      POSTGRES_PASSWORD: password
      POSTGRES_DB: flow
      POSTGRES_SSL: disable
    depends_on:
      - postgres
    volumes:
      - /path/to/store/CSV/file:/app/data

  postgres:
    image: postgres:latest
    restart: always
    ports:
      - "5432:5432"
    environment:
      POSTGRES_USER: postgres
      POSTGRES_PASSWORD: password
      POSTGRES_DB: flow
    volumes:
      - postgres_data:/var/lib/postgresql/data

volumes:
  postgres_data:
    driver: local

Dockerfile

FROM golang:1.22.0-alpine3.19

RUN mkdir -p /app

WORKDIR /app

COPY go.mod /app
COPY go.sum /app

COPY . /app

RUN go mod download

RUN go build -o flow .

CMD ["./flow"]

Data getting function

func GetBudgetData(filepath, filename string) error {
    bv := new(BudgetVariables)
    db, err := budget_db.Connection()
    if err != nil {
        return err
    }

    query := "SELECT categories, amounts FROM Budget"
    rows, err := db.Query(query)
    if err != nil {
        return err
    }
    defer rows.Close()

    file, err := os.Create(filepath + "/" + filename)
    if err != nil {
        return err
    }
    defer file.Close()

    writer := csv.NewWriter(file)
    defer writer.Flush()

    header := []string{"Category", "Amount"}
    if err := writer.Write(header); err != nil {
        return err
    }
    for rows.Next() {
        if err := rows.Scan(&bv.Category, &bv.Amount); err != nil {
            return err
        }

        data := []string{bv.Category, bv.Amount}
        if err := writer.Write(data); err != nil {
            return err
        }

        if err := rows.Err(); err != nil {
            return err
        }
    }
    fmt.Printf("Successfully created a '%s' file in '%s'\n", filename, filepath)
    return nil
}

推荐答案

您正在覆盖您的Dockerfile的CMD("./flow"),它通过在合成文件中使用command来执行您的脚本.

From the documentation:

command覆盖容器声明的默认命令 图像,例如由DockerFileCMD

Postgresql相关问答推荐

DBT-DBT依赖于未找到的源

使用pg_repack从PostgreSQL中的表中删除OID

忽略 split_part 的第 n 个分隔符之后

在Postgres中如何连接具有相同名称列的表并更改列名称?

在连接字符串并将其附加到 PostgreSQL 中的 where 子句时出现语法错误.怎么修?

Npgsql中准备好的语句和参数化查询有什么区别?

使用psql的copy语句时如何压缩数据?

在 Age Viewer 上看不到 node 的第一个属性

在 postgresql 数据库 timestampz 中保留用户偏移量

如何在 PostgreSQL 的回归测试中测试 TYPE 发送和接收函数

如何在 postgresql 中创建一个空的 JSON 对象?

使用 JDBC 连接到 PostgreSql 的本地实例

PostgreSQL 返回准确或最接近查询日期的日期

!= 和 <> 运算符有什么区别?

org.postgresql.util.PSQLException:错误:relation "app_user" does not exist

断言错误:Django-rest-Framework

从time without time zone和时区名称中获取time with time zone

如何从 PostgreSQL 中的 Json 数组中获取元素

postgres LISTEN/NOTIFY rails

性能调优:为布尔列创建索引