前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >docker 挂载文件不同步问题记录

docker 挂载文件不同步问题记录

原创
作者头像
张琳兮
修改2020-05-11 10:28:26
4.1K1
修改2020-05-11 10:28:26
举报
文章被收录于专栏:首富手记

# docker 挂载文件不同步问题记录

```bash

作者: 张首富

时间: 2020-05-09 晚

w x: y18163201

```

## 起因

今天上午开发给我反应一个问题,所在宿主机上更改了挂载的文件在 docker 里面看不到改变,问我是不是 docker 启动的时候挂载的时候有问题,我说不可能啊,怎么会有问题呢?于是自己亲自测试了一下,发现确实外面改完之后里面不生效.本以为是这台机器特殊有问题(因为我用 docker 两年了从来没有注意过这个问题),然后就换了个机器,发现还是一样,于是重视这个问题,看看到底是因为什么?

## 测试流程

启动一个 docker 挂载一个文件 和挂载一个目录

```bash

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 文件里面的内容

```bash

[root@test zsf]# docker exec -it test_volume cat /root/test.txt

test

```

发现我们能看到外面这个文件的信息,我们通过 vim/vi 在宿主机上编辑 test.txt 文件

```bash

[root@test zsf]# vim test.txt

[root@test zsf]# cat test.txt

test

test02

test03

```

然后我们在到 docker 里面看看我们新增的这两行有没有进去

```bash

[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 里面立马生效

```bash

[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

```bash

[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 的工作原理:

> 1,输入 vim 编辑文件

> 2,系统开始检查文件同级目录下有没有 .FileName.swp的文件

> 有: 会提示报错信息

> 无: 直接打开文件,同时产生这么一个临时的隐藏文件

> 3,然后我们开始编辑这个文件,其实这个时候我们所有的操作在我们没执行保存操作的时候,我们都在操作的是 .FileName.swp 这个文件,

> 4,当我们输入保存操作的时候, .FileName.swp 文件会把以前的 FileName 文件覆盖掉

在我们回顾完 vim 的工作模式之后这个问题其实就很好理解了,因为我们 vim 更改文件之后 inode 变了,但是 docker 里面使用的还是以前的 inode ,这个时候其实里面和外面只是两个文件名称一样的不同文件罢了,

![](https://s4.51cto.com/images/blog/202005/09/7d26b6fede0845e60784e10aae7c78c9.png?x-oss-process=image/watermark,size_16,text_QDUxQ1RP5Y2a5a6i,color_FFFFFF,t_100,g_se,x_10,y_10,shadow_90,type_ZmFuZ3poZW5naGVpdGk=)

当我们重启之后这个对应关系又再一次建立起来了,所以我们看到里面和外面的文件保持一致了

问题导致是查出来是什么原因了,但是我们实际上想解决的问题还是没办法解决啊,我这个时候想起有的时候以同样的方式 vim 更改文件内容,为什么更改完之后 docker 里面能立马生效了呢? 于是继续做实验

我给这个文件 777 权限之后,看看他有什么变化

```bash

chmoe 777 test.txt

```

![](https://s4.51cto.com/images/blog/202005/09/dd03b08f0f0cdb8d8b22551068cc57e8.png?x-oss-process=image/watermark,size_16,text_QDUxQ1RP5Y2a5a6i,color_FFFFFF,t_100,g_se,x_10,y_10,shadow_90,type_ZmFuZ3poZW5naGVpdGk=)

我们里面的东西几乎全部清空了,但是我发现一个我不知道的事情,为什么文件给了 777 权限之后,同样使用 vim 更改内容 他的 inode 号就不变了呢?(事情到此实际上已经找到我问题的解决方案了),但是我们碰到自己不会的东西要搞清楚啊,接着查阅资料

实验截图如下

![](https://s4.51cto.com/images/blog/202005/09/c3dd714c25907b5638abe6fa7436ef47.png?x-oss-process=image/watermark,size_16,text_QDUxQ1RP5Y2a5a6i,color_FFFFFF,t_100,g_se,x_10,y_10,shadow_90,type_ZmFuZ3poZW5naGVpdGk=)

![](https://s4.51cto.com/images/blog/202005/09/18eac36f1164cc3e66f362d7e3cd2af0.png?x-oss-process=image/watermark,size_16,text_QDUxQ1RP5Y2a5a6i,color_FFFFFF,t_100,g_se,x_10,y_10,shadow_90,type_ZmFuZ3poZW5naGVpdGk=)

疑问: 为什么同时都是用 vim 编辑的文件,777 权限和 644 权限的结果截然不同呢? 望哪位大佬看见能给解释一波,万分感谢?

原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。

如有侵权,请联系 cloudcommunity@tencent.com 删除。

原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。

如有侵权,请联系 cloudcommunity@tencent.com 删除。

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
相关产品与服务
容器镜像服务
容器镜像服务(Tencent Container Registry,TCR)为您提供安全独享、高性能的容器镜像托管分发服务。您可同时在全球多个地域创建独享实例,以实现容器镜像的就近拉取,降低拉取时间,节约带宽成本。TCR 提供细颗粒度的权限管理及访问控制,保障您的数据安全。
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档