【问题标题】:Reusing postgresql database from volume in docker-compose从 docker-compose 的卷中重用 postgresql 数据库
【发布时间】:2021-07-14 06:43:20
【问题描述】:

当我使用命令在 Docker 中创建卷时:

docker volume create pg-data

然后我从 postgres 图像设置基本的 postgresql 数据库:

docker run --rm -v pg-data:/var/lib/postgresql/data --name pg-docker -e POSTGRES_PASSWORD=docker -p 5433:5432 postgres

一切正常。数据库持久存在,我什至可以直接从主机访问它。我在这里创建了几个角色,例如app_user_1

然后我想使用 docker-compose 在容器中启动 postgresql。我事先关闭了上面的 postgresql 容器。

我有这个设置:

version: '3.7'

services:
  db:
    image: postgres
    volumes:
      - pg-data:/var/lib/postgresql/data/
    expose:
      - 5432
    restart: always
    environment:
      - POSTGRES_PASSWORD=docker
      - POSTGRES_USER=postgres
  web:
    build: .
    volumes:
      - ./app:/app
    ports:
      - 8001:8000
    environment:
      - ENVIRONMENT=dev
      - TESTING=0
    depends_on:
      - db

volumes:
  pg-data:

但是,即使我映射了与docker run 命令中相同的卷并使用相同的环境设置,使用 docker-compose 创建的容器中的 postgresql 实例似乎也没有数据库,也没有任何角色。 我收到以下错误:

psql: error: FATAL: role "postgres" does not exist

psql: error: FATAL: role "app_user_1" does not exist

所以看起来它的行为就好像它是 postgresql 的不同实例一样。 当我用docker run 重新启动第一个容器时,一切都在那里(所有数据库和角色)。

知道为什么会这样吗?如何重用 docker-compose 中第一个容器中的数据库?

【问题讨论】:

    标签: postgresql docker docker-compose


    【解决方案1】:

    您需要定义要使用的卷(您使用 docker volume create 手动创建的卷为 external 到 docker-compose,因为它是在外部创建的

    这是因为 docker-compose 创建的卷对它来说是“内部的”,所以使用由 docker 创建的卷是“外部的”。 =)

    参考https://docs.docker.com/storage/volumes/#use-a-volume-with-docker-compose的官方文档

    您的撰写文件的更改如下:

    ...
    volumes:
      pg-data:
        external: true
    

    (就最后一行)

    希望对您有所帮助! =)


    补充说明 您可以通过执行docker volume ls | grep pg-data 命令来确认这一点,该命令将列出所有卷,然后只显示引用“pg-data”的卷。 在我给出答案之前我正在测试的系统上,我得到以下信息:

    docker volume ls | grep pg-data
    local     pg-data
    local     postgresstackoverflow_pg-data
    

    如您所见,docker volume create 列在最前面,作为一个名为 'pg-data' 的本地卷,然后 docker-compose.yml 创建的接下来以 docker-compose 的命名约定为前缀,并带有目录名称当时就在里面。

    【讨论】:

    • 很好的解释。在 docker-compose 中使用外部卷有什么缺点吗?
    • Erm - 作为一个瞬间的想法,不是真的 - 不......除了在 yaml 中管理它们这样的明显点意味着它们可以立即识别,您可能不会立即手动清除一个名为 ' db-data' 意外地作为 'my-really-important-project-db-data' 很清楚它是什么......我不'认为'在外部使用 yaml 定义的卷有任何限制(作为外部)一个,如果您在一个 yaml 中定义它,您可能能够将它用作另一个外部定义的卷 - 我必须使用 POC 运行该用例...不知道
    • 可以看到yaml创建的volume在外面持续存在,所以挂载到另一个dockerfile应该问题不大。
    • 超级 - 我认为我能想到的唯一问题是确保您/在该环境中工作的其他工程师知道它是该撰写文件之外的共享卷......这就是我想要的地方可能通过创建为外部卷来接近它,以 docker volume create.... 开头,然后在两个 compose yamls 中将其定义为外部 - 因此从 yaml 内部可以清楚地看出它的外部......并且手动创建的卷是相当明显的。你也不能用docker-compose down -v 来释放它(它也会删除卷)
    猜你喜欢
    • 1970-01-01
    • 2020-04-06
    • 1970-01-01
    • 1970-01-01
    • 2018-04-08
    • 2020-02-06
    • 2021-12-25
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多