docker volumes file but create directory

遇到的问题

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等,然后正常启动

小结:
以上两种方法各有优劣,第一种是在部署的时候稍微麻烦一点,但其实就一次部署需要自己新建文件,之后部署直接复制粘贴即可。第二种方法部署的时候感觉比较简洁,不过有把无用文件加在了代码库,不是很推荐。综上,推荐使用第一种

扩展

上诉解决方法是针对生成特定文件名称的文件产生的,就是说文件名确定时的解决办法。

如果说在我们的程序中生成文件时,文件名不确定,比如随着时间变化,上诉方法就失效了。
这种情况没有好的解决办法,我们可以在程序中避免,将生成的文件放在特定的文件夹下,然后采用正常的映射关系就可以了。

猜你喜欢

转载自blog.csdn.net/csdniter/article/details/109214778