docker挂载文件与目录的不同之处
解决docker通过volumes挂载文件不生效,修改后容器内数据不同步,需要重启容器才能同步的问题 问题 在宿主机修改文件之后,容器内部不会同步生效,没有发生对应的修改,需要重启容器才可以正常同步。
原因 这是由于linux系统文件挂载机制导致的。 docker通过 volumes 挂载文件到容器中,有两种方式。挂载目录和挂载具体文件。 docker挂载文件时,并不是挂载了某个文件的路径,而是挂载了对应的文件,即挂载了linux指定的inode文件。
当使用vim之类的编辑器进行保存时,它不是直接保存文件,而是采用了备份、替换的策略,就是编辑时,是创建一个新的文件, 在保存的时候,把备份文件替换源文件,这个时候文件的 inode 就发生了变化,而原来 inode 对应的文件其实并没有修改, 也就是容器内的文件没有变化。当重启容器的时候,会挂载新的 inode
inode 示例,修改前:
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)避免直接挂载文件,而是挂载目录,挂载目录不会有上述情况 如果真要挂载目录,那么要将文件权限修改成777,即 -rwxrwxrwx 例如:chmod 777 test.conf
(2)宿主机和容器内一直使用echo想文件中写数据,不通过vi/vim 此时inode不变,文件可同步