我是 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/