【问题标题】:Why is data persisted when using postgres Docker image and docker-compose?为什么使用 postgres Docker image 和 docker-compose 时数据会持久化?
【发布时间】:2019-06-17 05:18:13
【问题描述】:

我是 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 自动创建的吗? (我注意到postgres 镜像的Dockerfile 中有一个VOLUME 命令,参见here)。

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

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

但是我怎样才能告诉 Docker 不使用之前自动持久化的数据呢?

【问题讨论】:

  • 我希望您提议的更改能达到您的预期;给定主机上的空 postgres_data 目录,使用该设置重新启动容器将重新运行首次数据库设置,您将拥有一个新的空数据库。

标签: django postgresql docker docker-compose volumes


【解决方案1】:

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

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

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

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2021-12-28
    • 2019-09-15
    • 2017-01-03
    • 1970-01-01
    • 2021-07-19
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多