主机和内部容器上的相同文件是不同的,它不是与其原来的同步
我遇到了一个奇怪的问题:我从主机上挂载一个文件到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,这是我发现的:
-
如果正在编辑的文件位于目录(RW模式下安装)中,则更改会立即显示在其容器的副本中。
-
如果一个文件被直接挂载,那么更改根本就不会被传输,看起来像容器正在维护它自己的文件版本!
事实上,这是非常不希望的行为,它打破了我的工作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 ...
- 使用Postgresql Dockerizing Spring Boot应用程序
- 为什么kubernetes源代码比其他容器协调器大一个数量级?
- 在centos7上安装docker后,无法启动docker。“docker.service的Job失败。
- Docker项目结构与子模块
- Jenkins构build+ Docker +自动部署
- 如何运行与docker的jekyll撰写获取 – 服务的不支持的configuration选项:“网站”
- 从mac os sierra主机加载内核模块到docker容器
- Rsync(或ssh)到EC2上的远程Docker容器
- 在Linux中加载共享库时出错; 使用docker和Python