部署至Minikube后Kubernetes无法找到Jar文件问题排查
问题分析与解决
问题描述
使用以下Dockerfile构建镜像:
FROM openjdk:17-alpine ARG APP_HOME=/app WORKDIR $APP_HOME COPY ./target/ws-exec.jar ws.jar ENV JAVA_OPTS="-Dspring.profiles.active=prod -Dspring.application.name=words" ENTRYPOINT java $JAVA_OPTS -jar ./ws.jar $JAVA_ARGS
本地执行docker run -it <image>可正常启动容器,docker exec -it <container>也能确认Jar文件存在于/app目录,但部署到Minikube后,容器日志持续报错:Error: Unable to access jarfile /ws.jar。
对应的Deployment配置如下:
apiVersion: apps/v1 kind: Deployment metadata: labels: app: revise-words-ws name: revise-words-ws namespace: default spec: replicas: 1 minReadySeconds: 45 selector: matchLabels: app: revise-words-ws strategy: rollingUpdate: maxSurge: 25% maxUnavailable: 25% type: RollingUpdate template: metadata: labels: app: revise-words-ws spec: containers: - image: maxrybalkin91/revise-words-ws:1.0 imagePullPolicy: IfNotPresent name: revise-words-ws env: - name: VAULT_TOKEN valueFrom: secretKeyRef: name: words key: vault_token - name: VAULT_HOST valueFrom: secretKeyRef: name: words key: vault_host - name: VAULT_PORT valueFrom: secretKeyRef: name: words key: vault_port ports: - name: liveness-port containerPort: 8089 resources: requests: cpu: 100m memory: 256Mi limits: cpu: 300m memory: 512Mi readinessProbe: httpGet: path: / port: liveness-port failureThreshold: 5 periodSeconds: 10 initialDelaySeconds: 60 livenessProbe: httpGet: path: / port: liveness-port failureThreshold: 5 periodSeconds: 10 initialDelaySeconds: 60 terminationGracePeriodSeconds: 30 restartPolicy: Always
可能的原因与解决方法
1. 镜像版本不一致
本地测试的镜像与Minikube拉取的镜像可能并非同一版本,导致Minikube中的镜像缺少/app/ws.jar文件。
- 解决步骤:
- 重新构建并推送最新镜像:
docker build -t maxrybalkin91/revise-words-ws:1.0 . && docker push maxrybalkin91/revise-words-ws:1.0 - 修改Deployment的
imagePullPolicy为Always,强制拉取最新镜像,再重新部署:kubectl apply -f deployment.yaml - 验证Minikube中的镜像内容:执行
minikube ssh进入节点,运行docker run --rm maxrybalkin91/revise-words-ws:1.0 ls /app,确认ws.jar存在。
- 重新构建并推送最新镜像:
2. 相对路径引发的工作目录异常
虽然Dockerfile中设置了WORKDIR /app,但Kubernetes环境中容器的工作目录可能未正确继承,导致./ws.jar被错误解析为根目录下的/ws.jar(实际文件在/app)。
- 解决步骤:
修改Dockerfile的ENTRYPOINT,使用绝对路径引用Jar包:
重新构建推送镜像后,再次部署到Minikube即可。ENTRYPOINT java $JAVA_OPTS -jar /app/ws.jar $JAVA_ARGS
3. Shell执行环境的路径解析问题
使用Shell形式的ENTRYPOINT时,可能因环境变量或执行上下文差异导致路径解析异常。可以改用exec形式明确指定执行环境:
- 修改后的Dockerfile片段:
该写法会明确基于ENTRYPOINT ["sh", "-c", "java $JAVA_OPTS -jar ./ws.jar $JAVA_ARGS"]WORKDIR解析相对路径,避免上下文差异带来的问题。
内容的提问来源于stack exchange,提问作者Maksym Rybalkin
相关产品推荐
相关产品推荐

