[英]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.