如何使用卷将数据保存在 dockerized postgres 数据库中

新手上路,请多包涵

我的 docker compose 文件有三个容器,web、nginx 和 postgres。 Postgres 看起来像这样:

 postgres:
  container_name: postgres
  restart: always
  image: postgres:latest
  volumes:
    - ./database:/var/lib/postgresql
  ports:
    - 5432:5432

我的目标是在 postgres 容器内挂载一个与名为 ./database 的本地文件夹相对应的卷 /var/lib/postgres 。当我启动这些容器并将数据插入到 postgres 中时,我验证 /var/lib/postgres/data/base/ 充满了我正在添加的数据(在 postgres 容器中),但在我的本地系统中, ./database 只得到一个 data 文件夹,即 ./database/data 已创建,但它是空的。为什么?

笔记:

更新 1

根据尼克的建议,我做了一个 docker inspect 并发现:

     "Mounts": [
        {
            "Source": "/Users/alex/Documents/MyApp/database",
            "Destination": "/var/lib/postgresql",
            "Mode": "rw",
            "RW": true,
            "Propagation": "rprivate"
        },
        {
            "Name": "e5bf22471215db058127109053e72e0a423d97b05a2afb4824b411322efd2c35",
            "Source": "/var/lib/docker/volumes/e5bf22471215db058127109053e72e0a423d97b05a2afb4824b411322efd2c35/_data",
            "Destination": "/var/lib/postgresql/data",
            "Driver": "local",
            "Mode": "",
            "RW": true,
            "Propagation": ""
        }
    ],

这使得数据似乎被我自己没有编码的另一卷偷走了。不知道为什么会这样。 postgres 图像是否为我创建了该卷?如果是这样,有没有办法在我重新启动时使用 该卷 而不是我正在安装的卷?否则,是否有禁用其他卷并使用我自己的 ./database 的好方法?

更新 2

感谢尼克,我找到了解决方案! (和另一位朋友)在下面回答。

原文由 Alex Lenail 发布,翻译遵循 CC BY-SA 4.0 许可协议

阅读 665
2 个回答

奇怪的是,解决方案最终变成了改变

volumes:
  - ./postgres-data:/var/lib/postgresql

volumes:
  - ./postgres-data:/var/lib/postgresql/data

原文由 Alex Lenail 发布,翻译遵循 CC BY-SA 3.0 许可协议

您可以为所有 Postgres 数据创建一个公共

docker volume create pgdata

或者您可以将其设置为撰写文件

version: "3"
services:
  db:
    image: postgres
    environment:
      - POSTGRES_USER=postgres
      - POSTGRES_PASSWORD=postgress
      - POSTGRES_DB=postgres
    ports:
      - "5433:5432"
    volumes:
      - pgdata:/var/lib/postgresql/data
    networks:
      - suruse
volumes:
  pgdata:

它将创建卷名 pgdata 并将该卷挂载到容器的路径。

您可以检查此卷

docker volume inspect pgdata

 // output will be
[
    {
        "Driver": "local",
        "Labels": {},
        "Mountpoint": "/var/lib/docker/volumes/pgdata/_data",
        "Name": "pgdata",
        "Options": {},
        "Scope": "local"
    }
]

原文由 Nishchit 发布,翻译遵循 CC BY-SA 4.0 许可协议

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题