【问题标题】:Moved docker-compose.yml creates a new postgres database移动 docker-compose.yml 创建一个新的 postgres 数据库
【发布时间】:2021-09-21 13:05:05
【问题描述】:

我已经在 ubuntu 上的 docker 上设置了一个 Postgres 数据库,其中 docker-compose.yml 仅用于文件夹 ~/postgres 中的该数据库,我将运行 docker-compose up -d 以从 ~/postgres 文件夹中运行我的数据库.

这是我的docker-compose.yml

version: '3'
services:
  database:
    image: "postgres"
    ports:
      - "0.0.0.0:5432:5432"
    env_file:
      - database.env
    volumes:
      - database-data:/var/lib/postgresql/data/

volumes:
  database-data:

这个数据库已经设置好并且运行良好,所以我决定也设置我的 Web 应用程序,因为 docker-compose.yml 文件在那个文件夹中,我将它移到了 ~/ 之外,所以我可以将它用于我的网络应用程序也是如此。

这是~/ 中的docker-compose.yml 的样子:

version: "3"
services:
  database:
    image: "postgres"
    ports:
      - "0.0.0.0:5432:5432"
    env_file:
      - postgres/database.env
    volumes:
      - database-data:/var/lib/postgresql/data/
  webapp:
    image: webapp/site
    build:
      context: ./retro-search-engine
      dockerfile: Dockerfile
      args:
        buildno: 1
    links:
      - "database:db"
    ports:
      - "0.0.0.0:8000:80"
    volumes:
      - webapp:/var/www
    environment:
      db_host: db
      db_username: xxxx
      db_password: xxxx
      db_database: xxxx
      db_port: 5432

volumes:
  database-data:
  webapp:

如您所见,数据库 docker 配置基本相同,唯一改变的是 database.env 文件的路径,因为它仍在之前的文件夹中。

所以,这里的问题是,当我从~/ 运行docker-compose up -d 时,一切正常启动,但是当我访问数据库时,我的所有表都消失了。

如果我返回~/postgres 并在该文件夹中执行docker-compose up -d(使用之前的docker-compose.yml)并连接到数据库,我可以访问我的表。

所以我认为正在发生的事情是它要么创建一个新容器,要么以某种方式存储数据的文件夹与docker-compose.yml 文件相关,并且它正在创建一个新数据库,因为它找不到旧文件。

我不知道如何解决这个问题,我用谷歌搜索并找不到任何东西,所以我决定在我转储我的整个数据库并将它恢复到一个我不想的新容器之前在这里询问这样做是因为它是一个 16gb 的数据库,而且需要很长时间。

有人知道如何将我的新 docker-compose.yml 与数据库中的数据一起使用吗?

提前致谢。

【问题讨论】:

    标签: postgresql docker docker-compose


    【解决方案1】:

    第一:

    • 替换:postgres/database.env./postgres/database.env
    • 使用docker compose up --build它将重建映像(如果您对 dockerfile 进行了一些更改,则很有用)。在开发时尽量避免使用 -d,您将避免运行大量容器。

    第二:

    我建议您遵循以下建议,如果您想使用管道 CI/CD 并按需创建更多“自主”映像和容器,它将解决您的问题,并且会更干净。

    rootfolder
    |-docker-compose.yaml
    |-postgres/
    |  |--All_other_files_for_the_postgres_docker_image
    |-webapp/
       |-- Dockerfile
       |-- All_other_files_for_the_webapp_docker_image
    

    你会发现我的“更正”:

    version: "3"
    services:
      database:
        image: "postgres"
        container_name: "my_postgres_container"
        ports:
          - "0.0.0.0:5432:5432"
        env_file:
          - ./postgres/database.env
        volumes:
          - database-data:/var/lib/postgresql/data/
      webapp:
        image: webapp/site
        container_name: "my_webapp_container"
        build:
          context: ./retro-search-engine
          dockerfile: Dockerfile
        links:
          - "database:db"
        ports:
          - "0.0.0.0:8000:80"
        volumes:
          - webapp:/var/www
        environment:
          db_host: db
          db_username: xxxx
          db_password: xxxx
          db_database: xxxx
          db_port: 5432
    
    volumes:
      database-data:
      webapp:
    

    如果您想使用已经存在的现有 postgres 图像(查看图像是否已经存在,您可以这样做:docker image | grep postgres

    然后你可以直接在你的 docker-compose 中做: 图片:“

    【讨论】:

    • database-data 是一个volume,volumes和mounts是有区别的。在大多数情况下,卷比数据库的挂载要好。除此之外,我将建议按照您的建议将 postgres/database.env 替换为 ./postgres/database.env ,您领先于我 :)。修正你的答案,我会投赞成票
    • 这样做!谢谢先生
    • 还有撰写文件
    • 感谢您在我身后阅读两次 :)
    • 抱歉,这不起作用,我在运行 docker-compose up --build 时收到此错误:构建数据库错误:当前上下文中没有构建阶段我在 postgres 目录中有一个空的 dockerfile,因为我正在使用原始 postgres 图像。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-10-24
    • 1970-01-01
    • 2018-06-30
    相关资源
    最近更新 更多