簡體   English   中英

為什么在使用postgres Docker鏡像和docker-compose時數據仍然存在?

[英]Why is data persisted when using postgres Docker image and docker-compose?

我是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命令,見這里 )。

現在我想在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 ...並在每次啟動時獲得處女容器。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM