当我在没有
-v
或 --volumes
的情况下运行 docker-compose 时,为什么我的数据丢失了? Docker 会删除我的卷吗?docker volume inspect pgdata
检查时,它始终显示当前时间戳,看起来每次都会重新创建。
但是当我刚刚使用
docker stop <container_id>
停止 postgres 容器并重新运行容器时,数据仍然存在。这是我的 docker-compose
version: '3.7'
services:
app:
container_name: bsf-quiz-app
image: sapkotasuren/bsf-quiz
ports:
- "443:8443"
depends_on:
- postgresqldb
postgresqldb:
image: postgres:latest
ports:
- "5432:5432"
volumes:
- pgdata:/var/lib/postgresql/data
environment:
- POSTGRES_PASSWORD=password
- POSTGRES_USER=postgres
- POSTGRES_DB=bsfQuiz
volumes:
pgdata:
我尝试以绑定挂载的方式进行操作,我看到创建了很多数据,但仍然存在同样的问题,在 docker-compose down 和 up 之后找不到我之前在数据库上创建的记录。
我还尝试使用 docker 命令创建命名卷:
docker create volume postgres
,并在我的 yaml 文件中提及它并将 external
设置为 true
。还是同样的问题!
我的 yaml 文件:
version: '3.9'
services:
app:
container_name: bsf-quiz-app
image: sapkotasuren/bsf-quiz
ports:
- "443:8443"
depends_on:
- postgresqldb
postgresqldb:
container_name: postgres
image: postgres:latest
volumes:
- postgres:/var/lib/postgresql/data
ports:
- "5432:5432"
environment:
- POSTGRES_PASSWORD=password
- POSTGRES_USER=postgres
- POSTGRES_DB=bsfQuiz
volumes:
postgres:
external: true
我遇到了与
docker compose down
相同的行为 - 我的 postgres 容器被删除,包括所有数据。对我来说,解决方案是使用这个:
docker-compose stop
我对 postgres 和 mongodb 挂载有类似的经历 - 尽管我在我的撰写文件中使用命名卷,但在运行
compose down
后我的数据库消失了。这是我发现的。
Docker 为 compose down
命令撰写文档:
停止容器并删除由
创建的容器、网络、卷和映像。 ... 默认情况下不会删除匿名卷。但是,由于它们没有稳定的名称,因此后续的up
不会自动安装它们。up
(您的卷是命名的,而不是匿名的,但这稍后会变得很重要。)
同时,docker composevolume文档说:
运行
会创建该卷(如果该卷尚不存在)。否则,如果在 Compose 之外手动删除现有卷,则会使用并重新创建现有卷。docker compose up
基于上述内容,在 compose 文件中声明的命名卷将被重复使用,并且应该在
docker compose down
中继续存在。
我检查了我的命名容器,发现 3 个用于我的 mongo 数据库的挂载(postgres 可能做了类似的事情):
"Mounts": [
{
"Name": "8a8e9d0aa777699d6fa72354515f7bc7573b4d6801555c820536d213dfe1401b",
"Source": "/var/lib/docker/volumes/8a8e9d0aa777699d6fa72354515f7bc7573b4d6801555c820536d213dfe1401b/_data",
"Destination": "/data/db"
},
{
"Name": "my-service_named-volume",
"Source": "/var/lib/docker/volumes/my-service_named-volume/_data",
"Destination": "/data"
},
{
"Name": "dcbc5de172d12a9c43671b9b67dfef5b9be760b4ee724a636216a36aebf3d81c",
"Source": "/var/lib/docker/volumes/dcbc5de172d12a9c43671b9b67dfef5b9be760b4ee724a636216a36aebf3d81c/_data",
"Destination": "/data/configdb"
}
],
我检查了这些卷上的时间戳,发现我的命名卷具有正确的、我最初创建它时的旧时间戳,但是两个匿名卷都标有我运行
compose down
/compose up
时的日期。
这应该可以解释为什么我们会丢失数据 - 在
compose down
匿名卷(在本例中实际上包含数据)未重新挂载时 - 创建新的匿名卷并随每个 compose up
挂载。
当我运行
docker volume ls
时,我可以看到另外两个未使用的匿名卷,其中包含我的数据。