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

После деплоя на миникубе вижу единственный лог: Error: Unable to access jarfile /ws.jar.

Я попытался запустить docker run -it <image> с именем моего образа, и он успешно запустился с докером. Запуск docker exec -it <container> показывает мне, что jar находится в нужной папке. Я попытался сделать исполняемый файл jar, добавив слой CMD или RUN в свой Dockerfile, но ничего не помогло. Где моя ошибка, или что я не понимаю?

UPD вот мой деплоймент.yaml

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

Можете ли вы docker run свой образ нормально? (Поскольку он построен, я был бы удивлен, если бы docker run ... bash предоставил вам интерактивную оболочку.) Если проблема конкретно в Minikube, можете ли вы отредактировать вопрос, включив в него YAML-файл развертывания Kubernetes?

David Maze 22.05.2023 12:58

@DavidMaze Только что добавил мою конфигурацию развертывания. У меня была опечатка, я не использовал bash, но использовал docker run maxrybalkin91/revise-words-ws:1.0 и увидел логи приложения в консоли, значит, jar был найден на изображении и выполнен

Maksym Rybalkin 22.05.2023 18:05

Я только что попробовал docker run maxrybalkin91/revise-words-ws:1.0, и кажется, что приложение запускается, но жалуется на отсутствие конфигурации. Не пробовал среду, которую вы указали. Но: в заголовке вопроса указано, что банка не найдена - и это неправда. Что мы здесь ищем?

Queeg 23.05.2023 11:58

@Queeg не находит конфигурацию, потому что она взята из хранилища, которое запускается в моем миникубе.

Maksym Rybalkin 23.05.2023 12:37

@Queeg Мы ищем причину, по которой образ запускается в докере, даже с ошибкой; но не запускается в Kubernetes

Maksym Rybalkin 23.05.2023 12:39
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
Как вычислять биты и понимать побитовые операторы в Java - объяснение с примерами
Как вычислять биты и понимать побитовые операторы в Java - объяснение с примерами
В компьютерном программировании биты играют важнейшую роль в представлении и манипулировании данными на двоичном уровне. Побитовые операции...
Поднятие тревоги для долго выполняющихся методов в Spring Boot
Поднятие тревоги для долго выполняющихся методов в Spring Boot
Приходилось ли вам сталкиваться с требованиями, в которых вас могли попросить поднять тревогу или выдать ошибку, когда метод Java занимает больше...
Полный курс Java для разработчиков веб-сайтов и приложений
Полный курс Java для разработчиков веб-сайтов и приложений
Получите сертификат Java Web и Application Developer, используя наш курс.
2
5
75
3
Перейти к ответу Данный вопрос помечен как решенный

Ответы 3

В качестве ENTRYPOINT вы указываете Java для запуска ./ws.jar, предполагая, что он будет разрешен из рабочего каталога /app. Во время выполнения вы получаете сообщение об ошибке, что /ws.jar недоступен, что выглядит как абсолютный путь.

При запуске вашего контейнера с помощью /bin/bash проверьте, где находится ваш файл jar и какой у него режим. Затем решите, кто прав, а кто виноват: ваш файл докера или ваше сообщение об ошибке. Почини сломанный.

Я добавил RUN ls ../app/ в свой Dockerfile, и вот журнал сборки ---> Running in fc6abc20b853 ws.jar

Maksym Rybalkin 22.05.2023 22:34

Если, как вы говорите, файл jar находится в правильном месте (и я предполагаю, что это /app), как насчет использования абсолютного пути для выполнения?

ENTRYPOINT java $JAVA_OPTS -jar $APP_HOME/ws.jar $JAVA_ARGS

Я пробовал это. Не помогло. Интересно, что запуск образа докера с помощью docker run находит банку и запускает приложение.

Maksym Rybalkin 22.05.2023 18:15

Только что попробовал это ENTRYPOINT java $JAVA_OPTS -jar ../app/ws.jar $JAVA_ARGS, и это не помогло

Maksym Rybalkin 22.05.2023 22:40

Сделать docker run ... успешным — вот в чем суть. Если вы достигли этого, что еще вам нужно?

Queeg 23.05.2023 08:10

В kubernetes не работает, мой pod вылетает с основной ошибкой

Maksym Rybalkin 23.05.2023 09:10

Так в чем же «основная ошибка»? Может быть, добавить это к вашему вопросу. То, что я понял, не связано с пропавшими баночками.

Queeg 23.05.2023 12:07
Ответ принят как подходящий

Как кажется, docker run maxrybalkin91/revise-words-ws:1.0 вызывает приложение, которое жалуется на отсутствие данных конфигурации, но нигде не найден файл jar.

Так как в миникубе вы видите совсем другую ошибку, возможно вы используете какой-то устаревший образ?

Попробуйте изменить imagePullPolilcy=Always и посмотрите, что получится.

https://kubernetes.io/docs/concepts/containers/images/

Это помогло! Большое спасибо! Похоже, он не использовал новый образ, даже он был перестроен и отправлен на мой хаб!

Maksym Rybalkin 23.05.2023 12:42

Другие вопросы по теме