从Dockerfile写入Docker卷不起作用

阿希克尔

请考虑以下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
亚瑟·乌尔费尔特

Dockerfile的每个步骤都在其自己的容器中运行,该容器在完成该步骤后将被丢弃,并且在命令使用完毕后删除最后一个使用它们的容器(仅在这种情况下),该卷将被丢弃。这使卷不适合在Dockerfile中使用,因为它们在中途丢失了其内容。Docker文件旨在能够在任何地方运行,如果它们使用持久化的Volumes,将使此工作变得更加困难。另一方面,如果您确实要这样做,则只需在主机上备份带有目录的卷即可。

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

上一次我需要此操作时,我将此步骤从docker文件中删除了,因为此步骤的想法是准备主机以运行此Dockerfile生成的映像。然后,我用docker run创建了一个容器,在该容器中运行了通常的数据库设置程序。

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

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

重要的想法是使容器的创建和主机设置分开。

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章