docker挂载单文件问题

关于docker中文件夹挂载成功 但是单文件挂载却没有生效的问题

因为用vim修改这里会有一个坑

docker -v mount 的机制:
-v mount 文件(或文件夹)时,docker 记录的是该文件的 inode,并用 inode 追踪。当用 vim 编辑了文件后,这个文件的 inode 就变了,也就是说这个 default.conf 文件已经不是运行 docker run 时的那个 default.conf 文件了,容器中自然也就没了新的改动。 同时该 issue 的 opener 使用的是 sed -i 修改,也会使 inode 发生变化,sed -i 的机制是创建一个新的临时文件,修改完后在重命名。对此,官方的建议是挂载文件夹,而不是文件。
https://github.com/moby/moby/issues/6011

上面这段参考:https://www.dazhuanlan.com/2020/01/02/5e0d7cfd57df8/

经测试发现,我挂载单文件的nginx的container,没重启之前修改挂载的单文件没有生效,但重启之后修改的配置文件确实会更新,对于nginx来说配置更新本身就需要重启,所以挂载文件其实也可以。但对于那些需要修改单文件但又想不重启container就可以实现更新的情况可以考虑挂载文件夹。我这里改为挂载文件夹。

//这里是挂载单文件,有坑,宿主机改配置后容器中配置没有修改,后面是挂载目录方式
root@Colin:~/web2# docker run --name web2 -d -p 80:80 --net host -v $(pwd)/config/html:/usr/share/nginx/html -v $(pwd)/config/conf/nginx.conf:/etc/nginx/nginx.conf -v $(pwd)/config/conf.d/default.conf:/etc/nginx/conf.d/default.conf -v $(pwd)/config/logs:/var/log/nginx fansolomon/my-nginx

//先将文件从web2 container(我之前运行的一个nginx容器)相关配置文件copy到本地机config目录下,html目录也是同理,还有需要新建logs目录
root@Colin:~/web3# docker cp web2:/etc/nginx config

//完成copy后目录如下
root@Colin:~/web3/config# ls
html  logs  nginx
root@Colin:~/web3/config/nginx# ls
conf  conf.d  fastcgi_params  koi-utf  koi-win  mime.types  modules  nginx.conf  scgi_params  uwsgi_params  win-utf

//然后重新建立一个web3 container,将单文件挂载改为目录挂载!
root@Colin:~/web3# docker run --name web3 -d -p 80:80 --net host -v $(pwd)/config/html:/usr/share/nginx/html -v $(pwd)/config/nginx:/etc/nginx -v $(pwd)/config/logs:/var/log/nginx fansolomon/my-nginx

//再修改宿主机web3文件夹中的config中配置,可以看到容器中的配置跟着更新了,成功
//进入/usr/sbin/后进行reload重新加载配置文件 可以看到修改已经生效

 

posted @ 2020-06-05 09:49  ytZhang  阅读(3412)  评论(0编辑  收藏  举报