Docker 卷导致容器行为出现故障

Docker volume creates malfunction in container behaviour

我正在尝试在 docker 容器 (confluence) 中创建一个目录卷。 https://hub.docker.com/r/atlassian/confluence-server/

要修复 postgres 的错误,我必须在容器中手动添加驱动程序文件。容器内的位置是:

/opt/atlassian/confluence/confluence/WEB-INF/lib

创建卷后,我想将更新的驱动程序添加到目录中。因此,在我的 docker-compose.yaml 中,我将一个卷映射到目录。

- ./data/driverfiles:/opt/atlassian/confluence/confluence/WEB-INF/lib

调用 docker-compose up 后创建卷和目录,一切正常。

问题是,该卷仍然是空的,当启动交互式 shell 进入容器时,曾经充满数千个文件的目录也是空的。从 docker-compose.yaml 删除卷时,目录再次充满文件。

客观地说,将卷映射到此目录似乎以某种方式禁止容器用文件丰富它,这是怎么回事?

如果你在容器目录上挂载主机目录,在容器启动时,这始终是一种单向操作:主机目录中的任何内容(如果有的话)完全替换可能已经在容器目录中的任何内容图片。容器中的内容永远不会被复制到主机目录中,除非图像启动代码明确地为您执行此操作。

如果需要修改容器中的某个配置文件,需要先将其拷贝出镜像;例如

# with the volumes: mount deleted
docker-compose run confluence \
  sh -c 'cd /opt/atlassian/confluence/confluence/WEB-INF/lib && tar cf - .' \
| tar xf - .

该特定调用会将整个目录复制到主机,您可以在其中再次安装它。

请注意,如果有更新的图像更改了此 lib 目录的内容,则主机上的内容将始终优先;这会隐藏可能在图像中进行的任何更改。

您可能会发现构建一个添加了您需要的驱动程序文件的自定义映像更可靠

FROM ...conflunce:...
COPY ... /opt/atlassian/confluence/confluence/WEB-INF/lib
# Use CMD and all other options from the original image

docker-compose.yml 文件中指定 build: .(并且没有 image:)以使用此 Dockerfile。