Построитель конвейера / контейнера Google Cloud Platform создает проблему с помощью команды COPY или ADD для приложения Spring Boot Java - PullRequest
0 голосов
/ 17 февраля 2019

Создан базовый микросервис HelloWorld с использованием Spring Boot (2.1.3), Java 8, Maven.

В pom.xml есть запись плагина maven, как показано ниже

<plugin>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-maven-plugin</artifactId>
            <configuration>
                    <mainClass>com.example.HelloWorldApplication</mainClass>
            </configuration>
        </plugin>

Dockerfile выглядит следующим образом

FROM openjdk:8
VOLUME /tmp
ADD target/helloworld.jar helloworld.jar
EXPOSE 8081
ENTRYPOINT ["java","-jar","helloworld.jar"]

Создание образа на локальном компьютере с помощью команды

docker build . -t helloworld:v1

Проверено созданием контейнера из него.Проверено в коде для учетной записи docker-hub и github.

Войдите в облачную платформу Google (GCP), создали кластер kubernetes, создали конвейер (с помощью компоновщика контейнеров), настроив URL-адрес github, в котором находится код микросервиса helloworld.Существует два варианта запуска сборки (используйте Dockerfile или cloudbuild.yaml).Я использую Dockerfile для запуска сборки.

Когда сборка подобрана для запуска, в этой строке в Dockerfile происходит сбой

ADD target/helloworld.jar helloworld.jar

Ошибка в журналах GCP:

ADD failed: stat /var/lib/docker/tmp/docker-builderxxxxxx/target/helloworld.jar: no such file or directory

Я пытался заменить его командой COPY, но проблема все та же.

Примечание: я пытался перейти с cloudbuild.yaml Вот как выглядит мой cloudbuild.yaml:

  steps:
  # Build the helloworld container image.
  - name: 'gcr.io/cloud-builders/docker'
    args:
      - 'build'
      - '-t'
      - 'gcr.io/${PROJECT_ID}/helloworld:${TAG_NAME}'
      - '.'

Это не имело никакого значения.Проблема остается прежней.

Есть ли у вас идеи, если у приложения Springboot Java есть какая-то конкретная конфигурация для корректной сборки Dockerfile в Google Cloud Platform?


ОБНОВЛЕНИЕ - 1

Исходя из комментариев, попробовал следующие шаги на локальном компьютере:

  1. выполнил команду mvn clean.Это очистило target папку

  2. обновленный Dockerfile

ОТ maven: 3.5-jdk-8 AS build
COPY src.
COPY pom.xml.
RUN mvn -f pom.xml очистить пакет

ОТ openjdk: 8
ОБЪЕМ / tmp
COPY --from = buildtarget / helloworld.jar helloworld.jar
ВОЗДЕЙСТВИЕ 8081
ENTRYPOINT ["java", "- jar", "helloworld.jar"]

Выполнить команду docker build . -t helloworld:v1 и созданный образ.

Затем запустить команду для запуска контейнера: docker run -p 8081:8081 -n helloworld-app -d helloworld:v1

контейнер запускается и выходит с ошибкой в ​​журнале:

Exception in thread "main" java.lang.ClassNotFoundException: com.example.HelloWorldApplication at java.net.URLClassLoader.findClass(URLClassLoader.java:382)

1 Ответ

0 голосов
/ 22 февраля 2019

Похоже, проблема с путями к файлам.

Попробуйте следующий обновленный Dockerfile, который явно устанавливает рабочий каталог.Он также использует явные пути к файлам при копировании банку между изображениями.

FROM maven:3.5-jdk-8-slim AS build
WORKDIR /home/app
COPY src     /home/app/src
COPY pom.xml /home/app
RUN mvn clean package

FROM openjdk:8-jre-slim
COPY --from=build /home/app/target/helloworld-0.0.1-SNAPSHOT.jar /usr/local/lib/helloworld.jar
EXPOSE 8081
ENTRYPOINT ["java","-jar","/usr/local/lib/helloworld.jar"]

Дополнительные примечания:

  • См. связанный ответ для полного примера создания приложения с загрузочной пружиной
  • Я основал второй этап на изображении JRE.Уменьшает размер выходного изображения.
...