'docker-compose up' 不会为 PostgreSQL 容器创建持久卷



我正在尝试为postgres docker容器创建一个持久卷存储。因为我将在这个docker环境中拥有一些其他服务,所以我使用docker-compose来启动容器。

我的docker-compose.yml文件的内容是:

version: "3.8"
services:
db:
image: postgres:12.3
volumes:
- ./postgres-data:/var/lib/posgresql/data
environment:
- POSTGRES_NAME=postgres
- POSTGRES_USER=postgres
- POSTGRES_PASSWORD=postgres
volumes:
postgres-data:

我运行命令:

docker-compose up

现在,根据文档和本例,我希望创建一个持久卷,其名称包括postgres-data(例如postgres-volume_postgres-data(。

相反,创建了两个卷:

docker volume ls

输出:

DRIVER    VOLUME NAME
local     a53a5b161f0fefca840e2f0cd2a97ad019864dea23c7f23f07c94e6be7ace601
local     postgres-volume_postgres-data

检查卷:

docker volume inspect a53a5b161f0fefca840e2f0cd2a97ad019864dea23c7f23f07c94e6be7ace601

输出:

[
{
"CreatedAt": "2022-02-07T19:12:04Z",
"Driver": "local",
"Labels": null,
"Mountpoint": "/var/lib/docker/volumes/a53a5b161f0fefca840e2f0cd2a97ad019864dea23c7f23f07c94e6be7ace601/_data",
"Name": "a53a5b161f0fefca840e2f0cd2a97ad019864dea23c7f23f07c94e6be7ace601",
"Options": null,
"Scope": "local"
}
]

检查第二卷:

docker volume inspect postgres-volume_postgres-data

输出:

[
{
"CreatedAt": "2022-02-07T19:12:02Z",
"Driver": "local",
"Labels": {
"com.docker.compose.project": "postgres-volume",
"com.docker.compose.version": "1.29.2",
"com.docker.compose.volume": "postgres-data"
},
"Mountpoint": "/var/lib/docker/volumes/postgres-volume_postgres-data/_data",
"Name": "postgres-volume_postgres-data",
"Options": null,
"Scope": "local"
}
]

在这两个卷中,只有a53a5b161f0fefca840e2f0cd2a97ad019864dea23c7f23f07c94e6be7ace601是活动的,并且所有数据似乎都存储在该卷中。

其效果是,当我使用docker-compose down时,容器运行时保存到数据库的所有数据都会丢失,即数据不会持久化,并且在再次运行docker-compose up后这些数据不可用。

我做错了什么?

(我使用的是macOS Big Sur,第11.4版。(

Docker&docker-compose版本:

➜  ~ docker --version
Docker version 20.10.7, build f0df350
➜  ~ docker-compose version
docker-compose version 1.29.2, build 5becea4c
docker-py version: 5.0.0
CPython version: 3.9.0
OpenSSL version: OpenSSL 1.1.1h  22 Sep 2020

您所做的被称为"绑定装载",其中主机上的目录被映射到容器中的目录。

如果要创建卷,则语法略有不同。改为

- postgres-data:/var/lib/posgresql/data

(即卷名之前没有路径信息(

当前,您正在装载一个主机路径。取出容器时,其内容物会丢失。您想要的是一个命名卷。在初始创建命名卷之后,您可以跨服务重用它,并且它将在以下调用中持久化。

docker-compose中,以下操作将创建命名卷myapp,并在名为"前端"的服务中使用它。文档和撰写参考资料很好地解释了这一点。

version: "3.9"
services:
frontend:
image: node:lts
volumes:
- myapp:/home/node/app
volumes:
myapp:

实际上,您也可以使用docker volume create myapp在外部创建卷,然后在添加external: truedocker-compose设置中引用它们。

volumes:
myapp:
external: true

最新更新