我的docker compose文件有三个容器,web,nginx和postgres.Postgres看起来像这样:
postgres: container_name: postgres restart: always image: postgres:latest volumes: - ./database:/var/lib/postgresql ports: - "5432:5432
我的目标是安装一个./database
与postgres容器内调用的本地文件夹相对应的卷/var/lib/postgres
.当我启动这些容器并将数据插入postgres时,我验证/var/lib/postgres/data/base/
了我正在添加的数据(在postgres容器中),但是在我的本地系统中,./database
只获取了一个data
文件夹,即./database/data
创建了它,但它是空的.为什么?
笔记:
这表明我的上述文件应该有效.
这个人正在使用有趣的码头服务
根据尼克的建议,我做了一个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
?
我找到了解决方案,感谢尼克!(和另一位朋友)以下答案.
奇怪的是,解决方案最终要改变
volumes: - ./postgres-data:/var/lib/postgresql
至
volumes: - ./postgres-data:/var/lib/postgresql/data
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" } ]
我会避免使用相对路径.请记住,docker是一个守护进程/客户端关系.
当你执行compose时,它基本上只是分解成各种docker客户端命令,然后传递给守护进程.那./database
是相对于守护进程,而不是客户端.
现在,docker开发团队在这个问题上有一些来回,但最重要的是它可以有一些意想不到的结果.
简而言之,不要使用相对路径,使用绝对路径.