将只读docker卷的变化反映到容器中?

Mei*_*ham 1 docker mounted-volumes docker-compose

我有一个配置文件在运行时使用只读卷注入到 Docker 中。因此容器无法更改配置文件的内容,但主机可以。这个想法是向容器内的进程发送 SIGHUB 以重新加载任何配置更改。然而,Docker 似乎无法检测到配置文件的任何更改,并且似乎看到了容器启动时文件的冻结快照。

这是 Docker 的预期行为吗?

BMi*_*tch 5

docker 用于主机卷的绑定挂载将 inode 映射到第二个位置。inode 是 Linux 中指向文件或目录的指针。大多数编辑器的标准过程不是就地修改文件,而是使用新的 inode 创建一个临时文件,然后用具有新 inode 的文件替换现有文件。这可以避免崩溃导致文件处于部分写入状态的损坏。您应该会ls -i在文件中看到这种情况发生。

对于绑定挂载,这意味着即使主机看到包含新内容的文件,您仍然可以绑定挂载到原始 inode。您可以通过以下任一方式解决该问题:

  • 绑定挂载整个文件夹而不是仅挂载文件
  • 重新创建容器以获取新的更改(重新启动也可能有效)
  • 编辑文件而不更改 inode

对于后者,像echo new line >>file或 这样的命令cat tmp-file >file将在 上保留相同的索引节点file。您也可以找到编辑器的设置。