主机和内部容器上的相同文件是不同的,它不是与其原来的同步

我遇到了一个奇怪的问题:我从主机上挂载一个文件到RW模式的容器,然后我在主机上编辑这个文件,但是它没有在容器中更新。

这是来自docker inspect <container>的输出的摘录:

 "Mounts": [ ... { "Type": "bind", "Source": "/home/a_user/projects/drupal/d8-default/composer.json", "Destination": "/var/www/d8-default/composer.json", "Mode": "rw", "RW": true, "Propagation": "" }, ... ] 

正如你所看到的那样,这个文件作为一个单独的挂载被安装为读写模式。 现在当我在主机上编辑它时,它在容器中不会被改变。 我通过login容器并在其外部执行简单的cat composer.json看到这一点。

我用随机文件进行了额外的testing,这是我发现的:

  1. 如果正在编辑的文件位于目录(RW模式下安装)中,则更改会立即显示在其容器的副本中。

  2. 如果一个文件被直接挂载,那么更改根本就不会被传输,看起来像容器正在维护它自己的文件版本!

事实上,这是非常不希望的行为,它打破了我的工作stream程,我还没有find克服这种不一致的解决scheme。 任何build议,欢迎。

当你将一个单独的文件挂载到一个容器中时,你挂载的是linux文件系统上文件的inode。 如果你replace文件(许多编辑器都这么做),那么inode就会改变。 这通常不是一个问题,如果您挂载一个完整的目录,因为该目录的指针更新inode。 但是当只安装一个文件时,启动容器后写入文件将不会在容器的内部和外部之间反映出来。

有关更多详细信息,请参阅此问题: https : //github.com/moby/moby/issues/6011


编辑:如果你的目标是修改一个容器外的文件,并修改一个文件的目录中的文件不能在卷挂载,那么我build议改变容器有一个符号链接一个不同目录中的文件,您可以挂载整个目录而不是单个文件。 这看起来像:

在你的Dockerfile中:

 RUN mkdir -p /var/docker/composer \ && ln -s /var/docker/composer/composer.json /var/www/d8-default/composer.json 

然后你的卷装:

 docker run -v /home/a_user/projects/drupal/d8-default:/var/docker/composer ...