Ale*_*ail 166 postgresql docker docker-compose docker-volume
我的docker compose文件有三个容器,web,nginx和postgres.Postgres看起来像这样:
postgres:
container_name: postgres
restart: always
image: postgres:latest
volumes:
- ./database:/var/lib/postgresql
ports:
- "5432:5432
Run Code Online (Sandbox Code Playgroud)
我的目标是安装一个./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": ""
}
],
Run Code Online (Sandbox Code Playgroud)
这似乎是数据被另一个我自己编码的卷偷走了.不知道为什么会这样.postgres图像是否为我创建了该卷?如果是这样,当我重新启动时,是否有某种方法可以使用该卷而不是我正在安装的卷?否则,是否有一种很好的方法可以禁用其他卷并使用我自己的卷./database?
我找到了解决方案,感谢尼克!(和另一位朋友)以下答案.
Ale*_*ail 216
奇怪的是,解决方案最终要改变
volumes:
- ./postgres-data:/var/lib/postgresql
Run Code Online (Sandbox Code Playgroud)
至
volumes:
- ./postgres-data:/var/lib/postgresql/data
Run Code Online (Sandbox Code Playgroud)
Nis*_*ani 81
docker volume create pgdata
Run Code Online (Sandbox Code Playgroud)
或者您可以将其设置为撰写文件
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:
Run Code Online (Sandbox Code Playgroud)
它将创建卷名称pgdata并将此卷装入容器的路径.
docker volume inspect pgdata
// output will be
[
{
"Driver": "local",
"Labels": {},
"Mountpoint": "/var/lib/docker/volumes/pgdata/_data",
"Name": "pgdata",
"Options": {},
"Scope": "local"
}
]
Run Code Online (Sandbox Code Playgroud)
小智 11
我会避免使用相对路径.请记住,docker是一个守护进程/客户端关系.
当你执行compose时,它基本上只是分解成各种docker客户端命令,然后传递给守护进程.那./database是相对于守护进程,而不是客户端.
现在,docker开发团队在这个问题上有一些来回,但最重要的是它可以有一些意想不到的结果.
简而言之,不要使用相对路径,使用绝对路径.
该postgres图像的 Dockerfile 包含这一行:
VOLUME /var/lib/postgresql/data
Run Code Online (Sandbox Code Playgroud)
当一个容器基于这个镜像启动时,如果没有其他东西挂载到那里,Docker会创建一个匿名卷并自动挂载它。您可以使用诸如 之类的命令查看此卷docker volume ls,这也是docker inspect您引用的输出中的第二个安装。
这样做的主要后果是您的外部卷挂载必须位于父目录上/var/lib/postgresql/data,而不是父目录中。(另请参阅@AlexLenail 的回答。)
如果您改为挂载主机目录/var/lib/postgresql,则:
/var/lib/postgresql./var/lib/postgresql/data,因此 Docker 创建匿名卷。./database/data主机上创建目录。结果就是您所看到的,数据库显然运行正常,但其数据不一定持久,您只能得到data主机上的空目录。
| 归档时间: |
|
| 查看次数: |
110498 次 |
| 最近记录: |