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

部署至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包:
    ENTRYPOINT java $JAVA_OPTS -jar /app/ws.jar $JAVA_ARGS
    
    重新构建推送镜像后,再次部署到Minikube即可。

3. Shell执行环境的路径解析问题

使用Shell形式的ENTRYPOINT时,可能因环境变量或执行上下文差异导致路径解析异常。可以改用exec形式明确指定执行环境:

  • 修改后的Dockerfile片段:
    ENTRYPOINT ["sh", "-c", "java $JAVA_OPTS -jar ./ws.jar $JAVA_ARGS"]
    
    该写法会明确基于WORKDIR解析相对路径,避免上下文差异带来的问题。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.21 06:17:51