docker volumes file but create directory

当Docker容器在运行中生成新文件时,尝试挂载到宿主机会创建目录而非文件。问题在于双方都不存在文件时,Docker默认创建文件夹。解决方法包括在宿主机或容器内预先创建文件。推荐在宿主机上创建,避免污染代码库。若文件名不固定,可将文件存于特定目录并常规映射。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

遇到的问题

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

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

扩展

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

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

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值