【问题标题】:How to use volume in docker compose for postgres?如何在 docker compose 中为 postgres 使用音量?
【发布时间】:2017-02-08 07:43:33
【问题描述】:

这是我正在使用的image

我把它命名为posgres_test

如果我单独运行图像

docker run -i -t -v="test_volume:/var/lib/postgresql" -p 5432:5432 posgres_test

我可以通过

访问它
psql -h 192.168.99.100 -p 5432 -U pguser -W pgdb

或者我可以使用我的 golang 应用访问它

// host is set to postgres
db, err := sql.Open("postgres", "postgres://pguser:pguser@postgres:5432/pgdb")
// table test_db is manually created.
rows, err := db.Query("SELECT name FROM test_db WHERE)

但是如果我使用docker compose

docker-compose.yml

version: "2"
services:
  postgres:
    image: my_image/postgresql:9.3
    volumes:
      - test_volume:/var/lib/postgresql
    ports:
      - "5432:5432"
  web:
    image: my-golang-app4
    ports:
      - "8080:8080"
volumes:
  test_volume: {}

我得到以下内容

pguser@pgdb ERROR:  relation "test_db" does not exist at character 15

我确定test_db 存在于test_volume 中,因为

docker run -i -t -v="test_volume:/var/lib/postgresql" -p 5432:5432 posgres_test
psql -h 192.168.99.100 -p 5432 -U pguser -W pgdb

\dt

将显示我创建的表

但似乎我在 docker compose 中的应用找不到它

谁能帮帮我?

【问题讨论】:

    标签: postgresql docker docker-compose


    【解决方案1】:

    关于您的 docker-compose 文件

    1. 首先我认为这是因为您不使用“链接”选项将您的 postgres 容器链接到 Web 容器 - 如果您不扩展端口,这是一个好习惯 - 但您扩展了 postgres 端口。

    2. 如果您想使用您发布的图片的继承 而不是使用这一行:

    my_image/postgresql:9.3

    使用:

    docker/postgres
    

    并创建路径 docker/postgres 并从您想要的容器中放置具有 inharitance 的 Dockerfile。

    1. 我总是像这样在 docker-compose.yml 中使用共享卷:

      .:/var/www/html

    . 是我放置代码文件的项目路径。

    我为测试此案例而创建的图片

    我没有你所有的 docker 文件结构来重现这个错误并修复它,所以我创建了 docker-compose 它应该满足你的需求或帮助解决你的问题:

    version: '2'
    services:
      web:
        build: docker/web
        ports:
          - "8080:8080"
        links:
          - dbpostgres 
        volumes:
          - .:/var/www/html   # I will share my code so I map this path
      dbpostgres:
        image: postgres
        volumes:
          - /private/var/lib/postgresql:/var/lib/postgresql
        ports:
          - "5432:5432"
        environment:
          POSTGRES_USER: pguser
          POSTGRES_PASSWORD: pguser
          POSTGRES_DB: pgdb
    

    注意事项:

    1. 我会推荐使用官方postgres图片

    2. 我把 cmets 放在了线条旁边。

    我是如何建立联系的:

    host=dbpostgres port=5432 dbname=pgdb user=pguser password=pguser
    

    因为我的 Web 容器现在知道主机 dbpostgres(图像名称和域名) - 我使用链接链接它们。

    如果您需要现有容器中的数据库

    如果您需要现有容器中的数据库,只需使用选项 docker cp 本地复制数据库:

    docker cp posgres_test:/var/lib/postgresql /private/var/lib/postgresql
    

    /private/var/lib/postgresql 是本地主机上的路径。 您还需要将 docker-compose 中的 db 凭据更改为旧凭据。 您必须在运行 docker-compose 之前执行此操作,因为如果 db 不存在,则会被装箱。

    如有任何问题,请告诉我。

    【讨论】:

    • 您能解释一下为什么我们需要在 docker-compose 中使用这个环境变量吗?
    • 你可以省略它。当我们要设置在启动容器中创建的数据库用户、密码和数据库名称时,我们只需要它。
    【解决方案2】:

    如果卷是外部的并且在使用 docker-compose 之前已经存在,则应将其声明为外部,否则 docker compose 将创建一个以项目名称为前缀的新卷。

    volumes:
      test_volume:
       external: true
    

    使用 compose v3 的 external 的文档(主要类似于 v2):https://docs.docker.com/compose/compose-file/compose-file-v3/#external

    【讨论】:

      【解决方案3】:

      我认为对你来说应该是这样的。

      docker run -itd -p 5432:5432 --name postgres_test -v /path/in/your/host :/path/in/your/container postgres_test psql -h 192.168.99.100 -p 5432 -U pguser -W pgdb
      

      阅读 Docker 文档(https://docs.docker.com/engine/tutorials/dockervolumes/),观看教程(有一个 Docker Youtube 频道,里面有很棒的教程)。

      【讨论】:

      • 当我单独运行 docker 容器时,我已经能够访问卷,(例如docker run -i -t -v="test_volume:/var/lib/postgresql" -p 5432:5432 posgres_test)当我使用 docker compose 时会出现问题
      • 没关系,我昨天误会了 ^^' 但是我在你的帖子中看到你的 docker-compose.yml 没有version: 'x' ,如果我记得很清楚,默认情况下 docker-compose take在这种情况下版本 1 和卷配置不起作用...尝试输入 version: '2'。我希望它会工作:)
      • 嗯...您是否尝试过在撰写文件中不使用 volumes: test_volume: {} 并放置完整路径或只是 /var/lib/postgresql ?直到现在我才使用它,所以我真的不知道它是如何使用的......如果它对你没有帮助,我无法帮助你解决这个问题......:/
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2022-08-04
      • 2019-04-22
      • 2022-01-01
      • 2020-07-05
      • 2018-11-21
      • 1970-01-01
      • 2018-04-06
      相关资源
      最近更新 更多