这是我的泊坞文件
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 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 shellpsql -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
目录中没有文件。我必须做错事,因为我假设我创建的表会持续存在 有人可以指出我的错误吗?
由于
答案 0 :(得分:2)
根据您的评论:
数据仍然存在,但我仍然无法在我的主机./data目录中找到持久数据
并运行此命令:
docker run -i -t -v="data:/data" -p 5432:5432 my_image/postgresql:9.3
您似乎混淆了指定的卷和主机卷。如果为卷指定了没有路径的名称(如data
),则会使用指定的卷。命名卷使用可以重用的给定名称下的docker驱动程序(通常是本地)存储数据。它的优点是列在docker volume ls
中,并在安装位置初始化为图像内容。
如果包含完整路径,例如/home/username/data
将从docker主机挂载目录而不是使用指定卷。最大的缺点是您没有使用映像中的内容初始化目录,并且您可能会遇到权限问题,即容器进程的uid与您在主机上使用的uid不匹配。
有关详细信息,请参阅https://docs.docker.com/engine/tutorials/dockervolumes/
答案 1 :(得分:1)
有些东西让我很困惑,对我来说在官方文档中并不是很清楚。
据我所知,可以用三种方式创建持久卷。
-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
指令,所以你是第三种情况。检查容器以查找文件,如果希望重复会话保留数据,请从命令行指定卷。