在主机和内部容器不同的是同一个文件,它不是在其原有的同步(The same file on host

2019-09-26 19:14发布

我遇到一个奇怪的问题:我安装来自主机的文件在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. 如果一个文件被直接安装然后更改不会转移可言,好像容器保持自己的版本的文件!

事实上,这是非常不希望的行为,它打破了我的工作流程,我还没有找到一个解决方案来克服这个跑偏呢。 任何建议都欢迎。

Answer 1:

当你安装一个单独的文件放入容器,你正在安装是在Linux文件系统的文件索引节点。 如果您替换文件(其中许多编辑做),那么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 ...


文章来源: The same file on host and inside container is different, it is not in sync with its original
标签: docker