如何解决Docker 卷会导致容器行为出现故障
我正在尝试在 docker 容器(confluence)中创建一个目录卷。 https://hub.docker.com/r/atlassian/confluence-server/
要修复 postgres 的错误,我必须在容器中手动添加驱动程序文件。容器内的位置是:
span.onclick = function() {
modal.style.display = "none";
player.pauseVideo();
}
window.onclick = function(event) {
if (event.target == modal) {
modal.style.display = "none";
player.pauseVideo();
}
}
创建卷后,我想将较新的驱动程序添加到目录中。因此,在我的 docker-compose.yaml 中,我将一个卷映射到该目录。
/opt/atlassian/confluence/confluence/WEB-INF/lib
调用 - ./data/driverfiles:/opt/atlassian/confluence/confluence/WEB-INF/lib
后创建卷和目录,一切正常。
问题是,该卷仍然是空的,并且当在容器中启动交互式 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
在 build: .
文件中指定 image:
(并且没有 docker-compose.yml
)以使用此 Dockerfile。
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。