做者: 张首富 时间: 2020-05-09 晚 w x: y18163201
今天上午开发给我反应一个问题,所在宿主机上更改了挂载的文件在 docker 里面看不到改变,问我是否是 docker 启动的时候挂载的时候有问题,我说不可能啊,怎么会有问题呢?因而本身亲自测试了一下,发现确实外面改完以后里面不生效.本觉得是这台机器特殊有问题(由于我用 docker 两年了历来没有注意过这个问题),而后就换了个机器,发现仍是同样,因而重视这个问题,看看究竟是由于什么?node
启动一个 docker 挂载一个文件 和挂载一个目录linux
mkdir -p /home/zsf/volume echo "test" >> /home/zsf/test.txt docker run -id --name test_volume -v /home/zsf/volume:/root/volume -v /home/zsf/test.txt:/root/test.txt busybox
而后咱们测试下在 docker 里面能不能看到外面挂载的 test.txt 文件里面的内容nginx
[root@test zsf]# docker exec -it test_volume cat /root/test.txt test
发现咱们能看到外面这个文件的信息,咱们经过 vim/vi 在宿主机上编辑 test.txt 文件docker
[root@test zsf]# vim test.txt [root@test zsf]# cat test.txt test test02 test03
而后咱们在到 docker 里面看看咱们新增的这两行有没有进去vim
[root@test zsf]# docker exec -it test_volume cat /root/test.txt test
发现咱们在外面更改的文件里面并未生效,那究竟是什么地方出问题了呢?当时想咱们要否则重启下这个容器试试呢?bash
[root@test zsf]# docker restart test_volume test_volume [root@test zsf]# docker exec -it test_volume cat /root/test.txt test test02 test03
发现重启以后,外面修改的内容在 docker 里面能看到了,那难道咱们每次在外面改完文件都要必须重启在 docker 里面才能看到吗? 我认为 docker 是不会把这种不合理的问题流传到如今(好比咱们更改完 nginx 的配置文件,须要 docker restart nginx,而不是用 nginx -s reload 吗?)我认为确定不是这样的,必定是有什么缘由形成了这种现象.因而继续作实验.
更改文件的方式又不是只有 vim 这一种方式,咱们尝试下别的方法会不会有这种问题,咱们用 sed/cat/echo
改变文件去看看会不会在 docker 里面立马生效ide
[root@test zsf]# echo "test04" >> test.txt [root@test zsf]# docker exec -it test_volume cat /root/test.txt test test02 test03 test04
发现用 echo 追加进去就立马生效了,那咱们再试试 cat 和 sed测试
[root@test zsf]# cat >> test.txt <<-'EOF' > test05 > EOF [root@test zsf]# docker exec -it test_volume cat /root/test.txt test test02 test03 test04 test05 [root@test zsf]# sed -i "s#test#zsf#g" test.txt [root@test zsf]# docker exec -it test_volume cat /root/test.txt test test02 test03 test04 test05 [root@test zsf]# cat test.txt zsf zsf02 zsf03 zsf04 zsf05
从上面实验来看 echo 和 cat 追加进去都正常,可是 vim 和 sed 不正常,那么咱们就大概能知道问题出在哪了,由于熟悉 linux 的伙伴们都知道,linux 系统是不区分文件格式的,linux 之间文件的关系是靠 inode 来决定的,而并不是文件名,因此这个问题会不会是 inode 搞得鬼呢?
咱们来回想下 vim 的工做原理:rest
1,输入 vim 编辑文件
2,系统开始检查文件同级目录下有没有 .FileName.swp的文件
有: 会提示报错信息
无: 直接打开文件,同时产生这么一个临时的隐藏文件
3,而后咱们开始编辑这个文件,其实这个时候咱们全部的操做在咱们没执行保存操做的时候,咱们都在操做的是 .FileName.swp 这个文件,
4,当咱们输入保存操做的时候, .FileName.swp 文件会把之前的 FileName 文件覆盖掉code
在咱们回顾完 vim 的工做模式以后这个问题其实就很好理解了,由于咱们 vim 更改文件以后 inode 变了,可是 docker 里面使用的仍是之前的 inode ,这个时候其实里面和外面只是两个文件名称同样的不一样文件罢了,
当咱们重启以后这个对应关系又再一次创建起来了,因此咱们看到里面和外面的文件保持一致了
问题致使是查出来是什么缘由了,可是咱们实际上想解决的问题仍是没办法解决啊,我这个时候想起有的时候以一样的方式 vim 更改文件内容,为何更改完以后 docker 里面能立马生效了呢? 因而继续作实验
我给这个文件 777 权限以后,看看他有什么变化
chmoe 777 test.txt
咱们里面的东西几乎所有清空了,可是我发现一个我不知道的事情,为何文件给了 777 权限以后,一样使用 vim 更改内容 他的 inode 号就不变了呢?(事情到此实际上已经找到我问题的解决方案了),可是咱们碰到本身不会的东西要搞清楚啊,接着查阅资料
实验截图以下疑问: 为何同时都是用 vim 编辑的文件,777 权限和 644 权限的结果大相径庭呢? 望哪位大佬看见能给解释一波,万分感谢?