遇到的问题
docker镜像在运行过程中会产生新的文件。我想把这个在容器中的新文件挂载到宿主机上方便查看和保留。在docker-compose.yml写法如下:
volumes:
- ./sample.txt:/code/sample.txt
# sample.txt是运行生成的新文件。/code是它在容器中的路径
然后结果却生成了两个文件夹sample.tex,分别在宿主机上和容器中,导致程序后续无法正常运行
问题的原因
容器启动时,如果容器和宿主机中均没有挂载的文件,则默认生成文件夹
以上是docker对上诉挂载问题的处理办法,因为新文件是在运行过程中生成的,宿主机也没有对应文件,所以结果上来说是正常的
解决的办法
一,在宿主机上事先生成新文件(推荐)
理解起来也很简单,问题原因就是两端都没有文件,没有挂载点导致的,所以默认生成两个文件夹。现在给宿主机上事先生成新文件,就形成了特定的挂载关系。操作如下:
touch sample.txt #docker-compose.yml同级目录下执行
docker-compose up -d ImageName #正常启动容器
其余不用修改,包括Dockerfile和docker-compose.yml等
二,在容器中添加文件
第二种方法是从容器中入手,在容器中事先生成新文件,思路同上
在Dockerflie中添加:
ADD ./sample.tex /code #在生成code目录后,code在此处是工作目录,可自己修改
前提是构建环境中有这个文件,也就是说要在代码库中也有这个文件
其余不用修改,包括docker-compose.yml等,然后正常启动
小结:
以上两种方法各有优劣,第一种是在部署的时候稍微麻烦一点,但其实就一次部署需要自己新建文件,之后部署直接复制粘贴即可。第二种方法部署的时候感觉比较简洁,不过有把无用文件加在了代码库,不是很推荐。综上,推荐使用第一种
扩展
上诉解决方法是针对生成特定文件名称的文件产生的,就是说文件名确定时的解决办法。
如果说在我们的程序中生成文件时,文件名不确定,比如随着时间变化,上诉方法就失效了。
这种情况没有好的解决办法,我们可以在程序中避免,将生成的文件放在特定的文件夹下,然后采用正常的映射关系就可以了。