postgresql - 如何在 docker compose 中为 postgres 使用音量?

标签 postgresql docker docker-compose

这里是 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 中的应用找不到它

谁能帮帮我?

最佳答案

关于您的 docker-compose 文件

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

  2. 如果你想继承你发布的图片

    而不是使用这一行:

    my_image/postgresql:9.3

    使用:

    docker/postgres
    

    并创建路径 docker/postgres 并放置 Dockerfile 并继承您想要的容器。

  3. 我总是像这样在 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. 我在这些行旁边留下了评论。

我是如何建立联系的:

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 不存在,它将被创建。

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

关于postgresql - 如何在 docker compose 中为 postgres 使用音量?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/42107364/

相关文章:

python - SqlAlchemy 1.4 抛出 InternalServerError(缓存查找失败,类型 3912040)

postgresql - 错误设置值 : value 0 is out of bounds for sequence "seq" (1. .9223372036854775807)

python - 如何在 docker 上安装 python 特定版本?

在浏览器中查看时,Docker-Compose minio 切换端口

sql - 在 SQL 表上使用哪种连接

arrays - 如何将一列以逗号分隔的字符串转换为字符串数组

amazon-web-services - 在 AWS Elastic Beanstalk 上使用 Docker 进行 Django 迁移

docker:如何显示 2 个图像之间的差异

docker - Docker Compose 3控制资源(内存,CPU)

mongodb - FIWARE Cygnus 在空间使用方面有任何问题吗?