2017-08-12 67 views
1

我遇到了一个奇怪的问题:我从一个主机到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": "" 
    }, 
    ... 
] 

您可能看到,该文件被安装为读写模式作为一个单独的安装。现在,当我在主机上编辑它时,它不会在容器中更改。我通过登录容器并在其外部进行简单的cat composer.json来看到这一点。

我和随机文件进行额外的测试,这里是我发现:

  1. 如果正在编辑位于一个目录(安装在RW模式)的文件,然后更改立即出现在其容器的副本。

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

事实上,这是非常不受欢迎的行为,它打破了我的工作流程,我还没有找到克服这种不一致的解决方案。欢迎任何建议。

回答

1

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

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


编辑:如果你的目标是修改文件的容器外,并有修改一个文件中的文件的目录,可以”那么我建议将容器更改为在不同目录中的文件的符号链接,以便装入整个目录而不是单个文件。这将是这样的:

在你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 ... 
+0

是的,谢谢。我也发现这个讨论:https://unix.stackexchange.com/questions/44373/single-bind-mounted-file-gets-out-of-sync-in-linux 我的解决方法是停止使用file-我一直在重新构建我的项目的结构以仅使用目录装载。 – Onkeltem

相关问题