gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-11-29 12:40:11 29 4
gpt4 key购买 nike

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

29 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com