基于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
相关产品推荐
相关产品推荐

