从Dockerfile写入docker卷不起作用

时间:2014-09-22 20:14:14

标签: docker volume

请考虑以下Dockerfile:

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

问题:" / data"目录不包含" HELLO"文件。此外,任何其他尝试写入卷目录(通过echo,mv,cp,...)都是不成功的 - 该目录始终为空。没有显示错误消息。

关于此问题,我在文档或stackoverflow上找不到任何内容。

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

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

1 个答案:

答案 0 :(得分:8)

Dockerfile的每一步都在它自己的容器中运行,在该步骤完成时将被丢弃,并且在命令完成后删除使用它们的最后一个(在这种情况下)容器时丢弃卷。 这使得卷不适合在Dockerfiles中使用,因为它们在中途丢失了它们的内容。 Docker文件旨在能够在任何地方运行,如果他们使用持久化的卷,则会使这更难。另一方面,如果你真的想要这个,只需用主机上的目录来备份卷。

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

上次我需要这个时,我将这个步骤从docker文件中删除了,因为这一步的想法是准备主机来运行这个Dockerfile生成的Image。然后我用docker run创建了一个容器,在那个容器中我运行了常用的DB设置。

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

现在,当此容器移动到新主机时,该数据目录可以随其一起提供,也可以在该主机上使用相同的进程创建。或者,如果在我的示例中,您想要其他应用程序的另一个mysql数据库,则不必重复创建容器。

重要的想法是保持容器创建和主机设置分离。