django - 为什么使用 postgres Docker 镜像和 docker-compose 时数据会被持久化?

标签 django postgresql docker docker-compose volumes

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

为了尝试这一点,我为我的应用程序创建了一个镜像 (Dockerfile),并使用基本的 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,将数据添加到数据库,停止 docker-compose 并再次启动它,数据仍然存在!

卷是由 Docker 自动创建的吗? (我注意到 postgres 镜像的 Dockerfile 中有一个 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 ...每次启动时您都会获得原始容器。

关于django - 为什么使用 postgres Docker 镜像和 docker-compose 时数据会被持久化?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/54330252/

相关文章:

python - 为什么我在 Django 通知中收到此错误?

python - 如何创建使用上下文管理器的 postgres 连接?

python - SQLAlchemy 中的用户定义函数创建

PostgreSQL 9.3 : Can I cast a column in a UNIQUE constraint?

docker - 如果在运行容器时未指定镜像版本,会发生什么情况

python - django 中的数据库一次性设置

python - QuerySet 在 shell 中工作但不在 Views.py 中工作 - Django 1.10

Django 路由 - 空路径与这些都不匹配

docker - COPY失败:stat/var/lib/docker/tmp/docker-builderXXXXX/default.conf:没有这样的文件或目录

docker - 为 docker 分配公共(public) IP