Dockerfile中RUN cp命令失效,tomcat容器内手动执行正常问题咨询
问题成因
该问题的核心原因是官方tomcat基础镜像默认将/usr/local/tomcat/webapps目录声明为了Volume挂载点:
- Dockerfile中通过
VOLUME指令声明的目录,在镜像构建阶段(也就是执行RUN指令的阶段)的所有写入操作,都不会被保存到镜像层中,会在构建完成后直接丢弃 - 你进入运行中的容器手动执行
cp指令时,容器已经完成了Volume的挂载,此时写入的内容会存储到Volume对应的存储区域,所以可以正常生效 - 你构建日志中显示
RUN cp步骤为CACHED,只是说明你之前构建过该层,哪怕你加--no-cache重新构建,拷贝的内容依旧不会保留到镜像中
验证方法
你可以执行以下命令确认基础镜像的VOLUME声明:
docker inspect tomcat:9.0 | grep Volumes -A 10
输出结果中会包含"/usr/local/tomcat/webapps": {}的配置,确认该目录是默认声明的Volume。
解决方案
可选方案如下,根据需求选择即可:
- 把拷贝逻辑放到容器启动阶段执行,修改Dockerfile的CMD指令:
# 替换原来的CMD行 CMD ["sh", "-c", "cp -pR /usr/local/tomcat/webapps.dist/* /usr/local/tomcat/webapps && catalina.sh run"]
- 直接修改tomcat配置,将默认站点目录改为
webapps.dist,无需拷贝:
修改conf/server.xml中Host节点的appBase属性值为webapps.dist - 如果你需要把内容固化到镜像中,可以自行编译无VOLUME声明的tomcat基础镜像,不推荐生产环境使用。
内容的提问来源于stack exchange,提问作者user65415642
相关产品推荐
相关产品推荐

