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 Inode:416481 硬链接: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 Inode:416483 硬链接: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、避免直接挂载文件,而是挂载目录,挂载目录不会有上述情况文章来源:https://www.toymoban.com/news/detail-411670.html
2、如果真要挂载文件,那么要将文件权限修改成777,即 -rwxrwxrwx文章来源地址https://www.toymoban.com/news/detail-411670.html
方法:chmod 777 filename
到了这里,关于【博客609】docker volume挂载本机文件出现不同步的问题解决的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!