Docker镜像本地正常但K8s Pod启动报错:无法访问jar文件
Kubernetes Pod启动失败:无法访问jar文件
问题现象
执行kubectl get pods得到如下结果:
kubectl get pods NAME READY STATUS RESTARTS AGE stubs-v2-78b59ccc4f-85xgr 0/1 CrashLoopBackOff 1 5m
查看Pod日志时出现错误:
➜ ~ kubectl logs stubs-v2-78b59ccc4f-85xgr Error: Unable to access jarfile stubs.jar
本地运行该Docker镜像时Spring Boot应用可正常启动,但部署到Kubernetes后出现上述问题。
相关配置文件
Dockerfile
FROM customimage ENV APP_NAME=myapp \ HOME=/home \ LOG_DIR=/logs RUN mkdir -p ${HOME} ${LOG_DIR} \ && chown --recursive ${USER_NAME}:${USER_GROUP} ${HOME} ${LOG_DIR} USER ${USER_NAME}:${USER_GROUP} COPY target/*.jar ${HOME}/app.jar EXPOSE 8080 9090 6566 ENTRYPOINT ["./spring_boot_app.sh"]
ReplicationController配置
apiVersion: v1 kind: ReplicationController metadata: name: my-app namespace: custom-ns spec: replicas: 1 selector: app: my-app template: metadata: labels: app: my-app spec: containers: - name: app-stub image: image-ref
问题原因及解决方法
1. Jar文件名不匹配
Dockerfile中复制的jar文件名为app.jar(路径/home/app.jar),但启动脚本spring_boot_app.sh中尝试访问的是stubs.jar,导致路径匹配失败。
解决:
- 方法一:修改启动脚本,将jar路径改为
/home/app.jar或app.jar(需确保工作目录在/home); - 方法二:修改Dockerfile,复制jar时重命名为
stubs.jar:COPY target/*.jar ${HOME}/stubs.jar
2. 工作目录未指定
Dockerfile未设置WORKDIR,默认工作目录为根目录/,启动脚本spring_boot_app.sh执行时,相对路径下找不到jar文件(jar在/home目录)。
解决:
在Dockerfile中添加WORKDIR指令,将工作目录切换到/home:
USER ${USER_NAME}:${USER_GROUP} WORKDIR ${HOME} # 添加这一行 COPY target/*.jar ${HOME}/app.jar
3. 启动脚本路径问题
若spring_boot_app.sh不在默认工作目录,执行./spring_boot_app.sh会找不到脚本(虽然当前日志错误是jar的问题,但需确保脚本可被正确执行)。
解决:
- 若脚本在
/home目录,需在Dockerfile中确保脚本被复制到该目录(如果base镜像没有的话),并使用绝对路径执行:ENTRYPOINT ["/home/spring_boot_app.sh"]
内容的提问来源于stack exchange,提问作者neel jain
相关产品推荐
相关产品推荐

