如何在YML中将第二个Docker镜像内容合并到Tomcat主镜像中?
解决方案
首先明确:你确实误解了depends_on的作用——它仅控制服务的启动顺序,不会自动将一个镜像的文件复制到另一个容器中,和文件共享/镜像内容合并完全无关。
针对你的需求,有两种高效的解决方案,推荐优先使用第一种:
方案一:Docker多阶段构建(推荐)
通过多阶段构建直接复用soa镜像的内容,每次更新Tomcat版本时,仅修改基础镜像标签即可,无需重新打包应用代码。
编写如下Dockerfile:
# 阶段1:引入soa镜像作为内容源 FROM your-soa-image:latest as soa-source # 阶段2:使用目标Tomcat基础镜像(更新版本时仅修改这里) FROM tomcat:10.1-jdk8-openjdk-slim # 从soa镜像复制所有需要的资源到Tomcat对应目录 COPY --from=soa-source /usr/local/tomcat/lib/ /usr/local/tomcat/lib/ COPY --from=soa-source /usr/local/tomcat/conf/ /usr/local/tomcat/conf/ COPY --from=soa-source /usr/local/tomcat/webapps-javaee/ /usr/local/tomcat/webapps-javaee/ COPY --from=soa-source /path/to/entrypoint.sh /usr/local/tomcat/bin/ # 给入口脚本添加执行权限 RUN chmod +x /usr/local/tomcat/bin/entrypoint.sh # 指定容器启动命令 ENTRYPOINT ["/usr/local/tomcat/bin/entrypoint.sh"] CMD ["catalina.sh", "run"]
优势:
- 每次Tomcat版本更新,仅修改第二阶段的
FROM镜像标签,重新构建时Docker会缓存soa镜像的内容,仅拉取新Tomcat镜像并复制文件,构建速度极快。 - 最终生成的镜像包含完整的Tomcat环境和应用内容,部署方式和之前一致,无需调整Compose配置。
方案二:使用Docker卷+临时内容加载容器
通过命名卷共享soa镜像的内容,Tomcat容器挂载这些卷运行,更新Tomcat时仅替换镜像即可。
编写docker-compose.yml:
services: tomcat: image: tomcat:10.1-jdk8-openjdk-slim # 更新版本时修改这里 volumes: - tomcat-lib:/usr/local/tomcat/lib - tomcat-conf:/usr/local/tomcat/conf - tomcat-webapps:/usr/local/tomcat/webapps-javaee entrypoint: /usr/local/tomcat/bin/entrypoint.sh command: catalina.sh run depends_on: - soa-content-loader # 一次性容器:将soa镜像的内容复制到共享卷 soa-content-loader: image: your-soa-image:latest volumes: - tomcat-lib:/target-lib - tomcat-conf:/target-conf - tomcat-webapps:/target-webapps command: > sh -c "cp -r /usr/local/tomcat/lib/* /target-lib/ && cp -r /usr/local/tomcat/conf/* /target-conf/ && cp -r /usr/local/tomcat/webapps-javaee/* /target-webapps/ && cp /path/to/entrypoint.sh /usr/local/tomcat/bin/entrypoint.sh" restart: "no" # 完成复制后自动退出,不再重启 volumes: tomcat-lib: tomcat-conf: tomcat-webapps:
注意事项:
- 首次启动时需等待
soa-content-loader容器完成复制操作,Tomcat才能正常运行。 - 若soa镜像更新,需手动删除旧卷并重新启动
soa-content-loader容器,否则会使用旧内容。
内容的提问来源于stack exchange,提问作者Muamer Bektić
相关产品推荐
相关产品推荐

