【博客609】docker volume挂载本机文件出现不同步的问题解决
阿里云国内75折 回扣 微信号:monov8 |
阿里云国际,腾讯云国际,低至75折。AWS 93折 免费开户实名账号 代冲值 优惠多多 微信号:monov8 飞机:@monov6 |
docker volume挂载本机文件出现不同步的问题解决
场景
docker volume挂载本机文件在宿主机修改文件之后容器内部不会同步生效没有发生对应的修改需要重启容器才可以正常同步。
场景演示
启动一个busybox容器挂载一个测试文件
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
在容器里查看文件内容
[root@test zsf]# docker exec -it test_volume cat /root/test.txt
test
修改宿主机上的文件
[root@test zsf]# cat test.txt
test-modify
在 docker 里面查看是否发生同步修改
[root@test zsf]# docker exec -it test_volume cat /root/test.txt
test
发现我们在外面更改的文件里面并未生效重启下这个容器试试呢?
[root@test zsf]# docker restart test_volume
test_volume
[root@test zsf]# docker exec -it test_volume cat /root/test.txt
test-modify
重启后就又可以同步看到修改的内容了那么原因是什么呢
原因
docker通过 volumes 挂载文件到容器中有两种方式。挂载目录和挂载具体文件。
挂载文件原理
docker挂载文件时并不是挂载了某个文件的路径而是挂载了对应的文件即挂载了linux指定的inode文件。当使用vim之类的编辑器进行保存时它不是直接保存文件而是采用了备份、替换的策略就是编辑时是创建一个新的文件在保存的时候把备份文件替换源文件这个时候文件的 inode 就发生了变化而原来 inode 对应的文件其实并没有修改也就是容器内的文件没有变化。当重启容器的时候会挂载新的 inode
文件inode经过vim修改后变化的示例修改前
root@ubuntu:~/Desktop/fileTest$ stat test.conf
文件test.conf
大小7 块8 IO 块4096 普通文件
设备801h/2049d Inode416481 硬链接1
权限(0664/-rw-rw-r--) Uid( 1000/ root) Gid( 1000/ root)
最近访问2020-03-29 21:45:00.355138304 +0800
最近更改2020-03-29 21:45:00.359137009 +0800
最近改动2020-03-29 21:45:00.367134421 +0800
创建时间-
通过 vi 等编辑器进行修改之后可以发现 inode 的值变了
root@ubuntu:~/Desktop/fileTest$ stat test.conf
文件test.conf
大小7 块8 IO 块4096 普通文件
设备801h/2049d Inode416483 硬链接1
权限(0664/-rw-rw-r--) Uid( 1000/ root) Gid( 1000/ root)
最近访问2020-03-29 21:45:42.594603856 +0800
最近更改2020-03-29 21:45:42.594603856 +0800
最近改动2020-03-29 21:45:42.598604612 +0800
创建时间-
解决方法
1、避免直接挂载文件而是挂载目录挂载目录不会有上述情况
2、如果真要挂载文件那么要将文件权限修改成777即 -rwxrwxrwx
方法chmod 777 filename