从Dockerfile写入Docker卷不起作用

请考虑下面的Dockerfile:

FROM phusion/baseimage VOLUME ["/data"] RUN touch /data/HELLO RUN ls -ls /data 

问题:“/ data”目录不包含“HELLO”文件。 而且,任何其他尝试写入卷目录(通过echo,mv,cp,…)都不成​​功 – 目录始终是空的。 没有显示错误信息。

我无法find关于这个问题的任何文档或在计算器上。

这是众所周知的还是新的?

docker version返回:

 Client version: 1.2.0 Client API version: 1.14 Go version (client): go1.3.1 Git commit (client): fa7b24f OS/Arch (client): linux/amd64 Server version: 1.2.0 Server API version: 1.14 Go version (server): go1.3.1 Git commit (server): fa7b24f 

Dockerfile的每一步都在它自己的容器中运行,当这一步完成时,这个容器将被丢弃,而当命令完成后,使用它们的最后一个容器(在这个例子中)将被删除。 这使得卷不适合在Dockerfiles中使用,因为它们在一半的时间内丢失了内容。 Docker文件的目的是能够在任何地方运行,如果他们使用持续存在的卷,将会使这变得更加困难。 另一方面,如果你真的想要这个,只需将主机上的目录备份回来。

PS:初始化主机的数据目录最好在Docker文件之外完成。

上次我需要这个,我把这一步离开docker文件,因为这个步骤的想法是准备主机来运行这个Dockerfile产生的图像。 然后我用Docker运行一个容器,在那个容器中运行了通常的DB安装程序。

 docker run -v /var/lib/mysql:/raid/.../mysql ... /usr/bin/mysql_install_db mysql_secure_installation 

现在,当这个容器移动到一个新的主机时,Data dir可以被带入,或者使用该主机上的同一个进程创build。 或者,如在我的例子中,如果你想另一个MySQL数据库的其他应用程序,你不必重复容器的创build。

重要的想法是保持容器创build和主机设置独立。