为什么 docker-compose down 会删除我的卷?如何避免“向下”执行此操作。 (Postgresql)

问题描述 投票:0回答:3

当我在没有

-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:

更新于 2021 年 1 月 20 日

我尝试以绑定挂载的方式进行操作,我看到创建了很多数据,但仍然存在同样的问题,在 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
postgresql docker docker-compose dockerfile
3个回答
9
投票

根据文档

docker compose down
不会删除任何卷,除非使用
-v
选项。


5
投票

我遇到了与

docker compose down
相同的行为 - 我的 postgres 容器被删除,包括所有数据。对我来说,解决方案是使用这个:

docker-compose stop

0
投票

我对 postgres 和 mongodb 挂载有类似的经历 - 尽管我在我的撰写文件中使用命名卷,但在运行

compose down
后我的数据库消失了。这是我发现的。

Docker 为 compose down

 命令撰写文档

停止容器并删除由

up
创建的容器、网络、卷和映像。 ... 默认情况下不会删除匿名卷。但是,由于它们没有稳定的名称,因此后续的
up
不会自动安装它们。

(您的卷是命名的,而不是匿名的,但这稍后会变得很重要。)

同时,docker composevolume文档说:

运行

docker compose up
会创建该卷(如果该卷尚不存在)。否则,如果在 Compose 之外手动删除现有卷,则会使用并重新创建现有卷。

基于上述内容,在 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
时,我可以看到另外两个未使用的匿名卷,其中包含我的数据。

© www.soinside.com 2019 - 2024. All rights reserved.