[英]Docker volume does not persist data
這是我的docker文件:
FROM ubuntu:14.04
RUN apt-key adv --keyserver keyserver.ubuntu.com --recv-keys B97B0AFCAA1A47F044F244A07FCC7D46ACCC4CF8
RUN echo "deb http://apt.postgresql.org/pub/repos/apt/ precise-pgdg main" > /etc/apt/sources.list.d/pgdg.list
RUN apt-get update && apt-get -y -q install python-software-properties software-properties-common \
&& apt-get -y -q install postgresql-9.3 postgresql-client-9.3 postgresql-contrib-9.3
USER postgres
RUN /etc/init.d/postgresql start \
&& psql --command "CREATE USER pguser WITH SUPERUSER PASSWORD 'pguser';" \
&& createdb -O pguser pgdb
USER root
RUN echo "host all all 0.0.0.0/0 md5" >> /etc/postgresql/9.3/main/pg_hba.conf
RUN echo "listen_addresses='*'" >> /etc/postgresql/9.3/main/postgresql.conf
EXPOSE 5432
RUN mkdir -p /var/run/postgresql && chown -R postgres /var/run/postgresql
VOLUME ["/etc/postgresql", "/var/log/postgresql", "/var/lib/postgresql"]
USER postgres
CMD ["/usr/lib/postgresql/9.3/bin/postgres", "-D", "/var/lib/postgresql/9.3/main", "-c", "config_file=/etc/postgresql/9.3/main/postgresql.conf"]
這是我做的...
我構建了docker鏡像:
docker build --rm=true -t my_image/postgresql:9.3
然后,我在當前目錄中創建一個名為data
的新目錄,並運行以下命令:
docker run -i -t -v="data:/data" -p 5432:5432 my_image/postgresql:9.3
我打開另一個終端並通過運行進入postgres shell:
psql -h my_docker_ip -p 5432 -U pguser -W pgdb
然后創建一個表:
pgdb=# create table test (test_id bigserial primary key);
我使用\\dt
驗證表是否存在並退出postgres shell
我終止docker進程並重新運行以下命令:
docker run -i -t -v="data:/data" -p 5432:5432 my_image/postgresql:9.3
我再次進入posgrest shell並運行\\dt
data
目錄中沒有文件。 我肯定做錯了,因為我假設我創建的表將持久存在。 有人可以指出我的錯誤嗎?
根據您的評論:
數據已持久,但是我仍然無法在主機./data目錄中找到持久數據
並運行以下命令:
docker run -i -t -v="data:/data" -p 5432:5432 my_image/postgresql:9.3
您似乎混淆了命名卷和主機卷。 當您給卷命名時沒有路徑,例如data
,則使用命名卷。 命名卷使用泊塢窗驅動程序(通常是本地驅動器)以可重用的給定名稱存儲數據。 它具有在docker volume ls
列出並在安裝位置初始化為映像內容的優點。
如果包括完整路徑,例如/home/username/data
,它將從Docker主機而不是使用命名卷掛載目錄。 最大的缺點是您沒有使用映像中的內容初始化目錄,並且可能會遇到權限問題,其中容器進程的uid與您在主機上使用的uid不匹配。
有關更多詳細信息,請參閱https://docs.docker.com/engine/tutorials/dockervolumes/
有一些讓我感到困惑的事情,對我而言,官方文檔中並不清楚。
據我所知,可以通過三種方式創建持久卷。
-v ~/database:/data
)的容器調用時 :使主機的外部文件夾在docker容器內可用。 兩者都可以修改它。 -v datamysql:/data
):在容器內部使持久卷可用。 如果它不存在,則會創建它。 您可以使用docker volume ls
按名稱列出它們。 在內部,它將存儲在/var/lib/docker/volumes/ae4445f7c9317a22fe84726fb894c47754f38a7fd150c00fd877024889968750/_data
。 VOLUME ["/database/data"]
)。 每次docker run
調用都會創建一個新卷,即使您刪除容器,該卷也將保留。 這可能會造成混亂,因為后續的調用將導致創建不同的卷,而這些卷將無法重用。 您可以使用以下命令列出已命名(第二種情況)卷和未命名(第三種情況)卷
$ docker volume ls
DRIVER VOLUME NAME
local 064593b3e65977097d4d0c8402a6c633f1af69be2937bf118678ab8f97ee9a7e
local 4753ad0437d13e54c76d9c34a30a1843396a1866a0cf9237d500fdcca0d78c5f
local 8d7a35354f666b2e8a26866a35bbae36bb9601701d4c6b505ab8ce6629f69415
local db48eefe8f189b36107ca9c4eebb792690590ab0ba055e7e4e2c9adfd1765b7e
local datamysql
您可以使用docker inspect mycontainer
容器的確切位置
{
"Type": "volume",
"Name": "8d7a35354f666b2e8a26866a35bbae36bb9601701d4c6b505ab8ce6629f69415",
"Source": "/media/USBdrive/docker/volumes/8d7a35354f666b2e8a26866a35bbae36bb9601701d4c6b505ab8ce6629f69415/_data",
"Destination": "/var/lib/mysql",
"Driver": "local",
"Mode": "",
"RW": true,
"Propagation": ""
},
刪除未使用的卷可能很方便(特別是對於第三種情況)。
$ docker volume prune
WARNING! This will remove all volumes not used by at least one container.
Are you sure you want to continue? [y/N] y
Deleted Volumes:
4753ad0437d13e54c76d9c34a30a1843396a1866a0cf9237d500fdcca0d78c5f
Total reclaimed space: 205MB
因為您在Dockerfile中使用了VOLUME
指令,所以處於第三種情況。 檢查您的容器以查找文件,如果要重復的會話來保留數據,請從命令行指定卷。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.