簡體   English   中英

Docker卷不保留數據

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

這是我做的...

  1. 我構建了docker鏡像:

     docker build --rm=true -t my_image/postgresql:9.3 
  2. 然后,我在當前目錄中創建一個名為data的新目錄,並運行以下命令:

     docker run -i -t -v="data:/data" -p 5432:5432 my_image/postgresql:9.3 
  3. 我打開另一個終端並通過運行進入postgres shell:

     psql -h my_docker_ip -p 5432 -U pguser -W pgdb 

    然后創建一個表:

     pgdb=# create table test (test_id bigserial primary key); 
  4. 我使用\\dt驗證表是否存在並退出postgres shell

  5. 我終止docker進程並重新運行以下命令:

     docker run -i -t -v="data:/data" -p 5432:5432 my_image/postgresql:9.3 
  6. 我再次進入posgrest shell並運行\\dt

  7. 我注意到
    • 沒有桌子。
    • 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
  • 在容器構建時 (Dockerfile中的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.

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