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

How to persist data in a dockerized postgres database using volumes

我的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

根据 Nick 的建议,我做了 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 图像是否为我创建了那个卷?如果是这样,有没有什么方法可以使用 that volume 而不是我在重新启动时安装的卷?否则,是否有禁用其他卷并使用我自己的卷的好方法,./database?

更新 2

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

我会避免使用相对路径。请记住 docker 是 daemon/client 关系。

当您执行组合时,它实际上只是分解成各种 docker 客户端命令,然后将这些命令传递给守护程序。 ./database 是相对于 守护程序 ,而不是客户端。

现在,the docker dev team has some back and forth on this issue,但底线是它可能会产生一些意想不到的结果。

总之,不要使用相对路径,使用绝对路径。

我认为您只需要先使用 docker create -v /location --name 在 docker 之外创建卷,然后重新使用它。

当我经常使用 docker 时,无法使用具有 docker 文件定义的静态 docker 卷,所以我的建议是尝试命令行(最终带有脚本).

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

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

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

您可以为所有 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"
    }
]