You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

基于Distroless Java11镜像部署Tomcat启动报错求助

问题分析与修复方案

错误根源

distroless java:11 镜像的ENTRYPOINT已经预设为java命令,你在CMD里重复写java,会导致java把第一个参数"java"当成要执行的jar文件,直接触发Error: Unable to access jarfile java错误。

另外你的Dockerfile还有两个隐性问题:

  • ADD apache-tomcat-9.0.87.tar.gz /usr/local/tomcat 会把压缩包解压到/usr/local/tomcat/apache-tomcat-9.0.87/子目录,导致CATALINA_HOME路径和实际文件结构不匹配,后续找不到正确的启动文件。
  • 额外复制bootstrap.jar完全多余,解压后的Tomcat包本身就包含这个文件。

修正后的Dockerfile

FROM gcr.io/distroless/java:11
# 先把Tomcat包解压到/usr/local目录
ADD apache-tomcat-9.0.87.tar.gz /usr/local/
# 重命名解压后的目录,让CATALINA_HOME路径直接对应到Tomcat根目录
RUN mv /usr/local/apache-tomcat-9.0.87 /usr/local/tomcat
WORKDIR /usr/local/tomcat
# 只复制war包即可
COPY app1.war /usr/local/tomcat/webapps/
ENV TOMCAT_MAJOR=9 \
    TOMCAT_VERSION=9.0.87 \
    CATALINA_HOME=/usr/local/tomcat   \
    JAVA_OPTS="-Xms1G -Xmx1G"
    
EXPOSE 8080
# 去掉开头的"java",直接给ENTRYPOINT的java命令传参数
# 注意classpath要包含bootstrap.jar和tomcat-juli.jar,否则启动会缺依赖
CMD ["-cp", "/usr/local/tomcat/bin/bootstrap.jar:/usr/local/tomcat/bin/tomcat-juli.jar", "org.apache.catalina.startup.Bootstrap", "start"]

补充说明

  • Tomcat启动依赖bootstrap.jar和tomcat-juli.jar两个核心jar包,只指定前者会导致后续启动报错,务必都加入classpath。
  • distroless镜像默认用nonroot用户运行,解压后的Tomcat目录权限足够该用户读取执行,不需要额外修改权限。
  • 如果不想修改解压目录结构,也可以把CATALINA_HOME设为/usr/local/tomcat/apache-tomcat-9.0.87,同时同步修改CMD里的路径。

内容的提问来源于stack exchange,提问作者babs84

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.26 06:53:18