使用postgres Docker映像和docker-compose时为什么数据仍然存在?

时间:2019-01-23 15:10:45

标签: 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,将数据添加到db,停止docker-compose并再次启动,则数据仍然存在!

Docker是否自动创建了一个卷? (我注意到VOLUME映像的Dockerfile中有一个postgres命令,请参见here。)

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

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

但是我如何告诉Docker不要使用自动持久保存的先前数据?

1 个答案:

答案 0 :(得分:2)

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

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

当您显式删除容器时,发生第二个。可以使用特殊命令或在启动时应用删除参数(例如docker run --rm ...)来完成。在这种情况下,容器的数据将丢失。

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