如何保持Docker容器卷文件?

我想与主机共享~/mydir目录,但不能用主机文件replaceDocker容器目录。 所以,我有docker-compose.yml

 version: '2' services: app: container_name: mono build: . volumes: # save .composer files on host to keep cache warmed up - '/srv/mono/mydir:/root/mydir' command: sleep infinity 

Dockerfile

 #/bin/bash FROM php:5.6 RUN mkdir /root/mydir && echo '{}' > /root/mydir/myfile.json VOLUME /root/mydir 

Directory /srv/mono/mydir是空的。 它被replace为主机目录。 很明显。

但如何保留原始文件?

例如,它适用于MySQL Percona容器:

 version: '2' services: percona-56: container_name: percona-56 image: percona/percona-server:5.6 volumes: - /srv/mysql/percona-56:/var/lib/mysql environment: MYSQL_ALLOW_EMPTY_PASSWORD: 'yes' 

有来自容器的原始文件:

 $ ll /srv/mysql/percona-56 total 176220 auto.cnf error.log ibdata1 ib_logfile0 ib_logfile1 init.ok mysql performance_schema 

我试图检查Percona Dockerfile,但没有发现与卷共享有关的东西。

 $ docker --version Docker version 1.12.3, build 6b644ec 

在Docker运行中添加VOLUME时,您所说的是使用主要主机文件系统,而不是Docker使用的用于映像的写入时复制文件系统。 这里有两个主要的选项 – 1.你绑定一个实际的文件系统位置到镜像中。 这是你在这里做的。 2.您让Docker处理位置…在这种情况下,Docker会在主文件系统上创build位置,然后将该映像的内容复制到该位置以启动。

您正在寻求获得两个 – 你想在你的文件系统的固定位置,但你想从你的图像文件在那里。 现在,有一个原因,它不这样工作! 如果该文件夹中已经存在“auto.conf”并启动容器,会发生什么情况? 如果将两个容器指向同一位置,并将该文件的不同版本运行,会发生什么情况? 这就是为什么如果你select一个真实的位置,它不会试图猜测图像和文件系统之间的冲突,它只是与文件系统一起进行。

你可以达到你想要的。 实际上有两种select。 更好的方法是让您的应用程序从两个独立的文件夹中读取 – 一个在图像中填充,另一个在文件系统中。 这完全避免了这个问题;)第二种方法是进入Docker并告诉Docker如何处理图片中的单个文件。

 version: '2' services: app: container_name: mono build: . volumes: # save .composer files on host to keep cache warmed up - '/srv/mono/mydir:/root/mydir' # Marking a volume this way will tell Docker to use THIS file # from the image, even though the parent directory is a regular # volume. If you have an auto.cnf file in your directory, it # will be ignored. - /root/mydir/auto.cnf command: sleep infinity