我是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
,将数据添加到db,停止docker-compose并再次启动,则数据仍然存在!
Docker是否自动创建了一个卷? (我注意到VOLUME
映像的Dockerfile中有一个postgres
命令,请参见here。)
现在,我想向docker-compose添加一个卷以将数据库存储在我可以控制的位置。我怎样才能做到这一点?我以为我应该将docker-compose文件更改为
...
db:
image: postgres
volumes:
- ./postgres_data:/var/lib/postgresql/data
...
但是我如何告诉Docker不要使用自动持久保存的先前数据?
答案 0 :(得分:2)
您应该区分容器的停止和容器的移除。
第一次发生在容器中的主进程停止执行时(可能是因为您手动发送了停止信号)。在这种情况下,容器仍然可用,并且可以在其中保留所有数据的情况下重新启动容器。这就是您的示例中发生的情况。
当您显式删除容器时,发生第二个。可以使用特殊命令或在启动时应用删除参数(例如docker run --rm ...
)来完成。在这种情况下,容器的数据将丢失。
docker-compose
默认情况下不会删除容器并重新启动它们。要更改行为,只需使用docker-compose up --force-recreate ...
,您将在每次启动时获得原始容器。