为什么在使用 postgres Docker 图像和 docker-compose 时数据会保留?

Why is data persisted when using postgres Docker image and docker-compose?

我是 Docker 的新手,我正在尝试让 Django 应用程序在 Docker 容器中运行。此应用需要 PostgreSQL 数据库(和 Redis)。

为了尝试,我为我的应用程序创建了一个图像(Docker 文件),并为数据库服务器使用了基本的 postgres 图像。我的 docker-compose 文件如下所示:

version: '3.7'

services:
  db:
    image: postgres
  redis:
    image: redis
  api:
    build: .
    command: python3 manage.py runserver 0.0.0.0:8000
    environment:
      - DJANGO_SETTINGS_MODULE=api.settings.docker_settings
    volumes:
      - ./api:/code/api
    ports:
      - "8000:8000"
    depends_on:
      - db
      - redis

由于我的 docker-compose 文件没有为数据库定义任何卷,我预计容器停止时数据库数据会丢失,但事实并非如此!也就是说,如果我运行docker-compose up,往db里添加数据,停止docker-compose再启动,数据还在!

卷是由Docker自动创建的吗? (我注意到 postgres 图像的 Docker 文件中有一个 VOLUME 命令,参见 here)。

现在我想添加一个卷到 docker-compose 以将数据库存储在我可以控制的地方。我怎样才能做到这一点?我想我应该将 docker-compose 文件更改为

...
db:
    image: postgres
    volumes:
      - ./postgres_data:/var/lib/postgresql/data
...

但是如何告诉Docker不要使用之前自动持久化的数据呢?

你应该区分容器的停止和容器的移除。

首先发生在容器中的主进程停止执行时(可能是因为您手动发送了停止信号)。在这种情况下,容器仍然可用,并且可以重新启动并保留其中的所有数据。这就是您的示例中发生的情况。

第二次发生在您明确删除容器时。它可以通过特殊命令或在开始时应用删除参数(如 docker run --rm ...)来完成。在这种情况下,容器的数据丢失了。

docker-compose 默认情况下不删除容器并重新启动它们。要更改此行为,只需使用 docker-compose up --force-recreate ...,您将在每次启动时获得原始容器。