Приложение Maven + Java в Dockerfile - PullRequest
3 голосов
/ 27 мая 2020

Я новичок в java и maven. Я создал приложение, которое выполняет задание flink. Я создал базовое изображение docker, но я не уверен, как выполнить / запустить, как будто я запускаю приложение в терминале.

Я сейчас запускаю приложение в терминале следующим образом:

 mvn package exec:java `-D exec.args="--runner=FlinkRunner --flinkMaster=localhost:8081 --filesToStage=.\target\maven_benchmark-1.0-SNAPSHOT-jar-with-dependencies.jar `" -P flink-runner`

Вот мой docker файл

FROM maven:latest AS build
COPY src /usr/src/app/src
COPY pom.xml /usr/src/app
RUN mvn -f /usr/src/app/pom.xml clean package

FROM openjdk:14
COPY --from=build /usr/src/app/target/maven_benchmark-1.0-SNAPSHOT-jar-with-dependencies.jar /usr/app/maven_benchmark-1.0-SNAPSHOT-jar-with-dependencies.jar
WORKDIR /usr/app
EXPOSE 8080
ENTRYPOINT ["java","-jar","maven_benchmark-1.0-SNAPSHOT-jar-with-dependencies.jar"]

Есть предложения?

Заранее спасибо!

1 Ответ

0 голосов
/ 27 мая 2020

Вы запускаете приложение с плагином maven и с профилем maven. Сначала вам нужно, чтобы ваше приложение работало вне maven.

Затем вам нужно немного очистить свои docker шаги, вот несколько предложений:

  • Переместить копию sr c после копирования pom и загрузки зависимостей
  • Не использовать root пользователь для рабочего изображения
  • Использовать базовое изображение слаймера для рабочего образа
  • Используйте взорванные банки вместо толстых, чтобы получить более тонкие слои
  • Использовать из .dockerignore, чтобы предотвратить копирование нежелательных вещей в образ.

Вот пример файла Docker:

FROM maven:3.6.3-openjdk-14-slim AS build
WORKDIR /build
# copy just pom.xml (dependencies and dowload them all for offline access later - cache layer)
COPY pom.xml .
RUN mvn dependency:go-offline -B
# copy source files and compile them (.dockerignore should handle what to copy)
COPY . .
RUN mvn package
# Explode fat runnable JARS
ARG DEPENDENCY=/build/target/dependency
RUN mkdir -p ${DEPENDENCY} && (cd ${DEPENDENCY}; jar -xf ../*.jar)


# Runnable image
FROM openjdk:14-alpine as runnable
VOLUME /tmp
VOLUME /logs
ARG DEPENDENCY=/build/target/dependency
# Create User&Group to not run docker images with root user
RUN addgroup -S awesome && adduser -S awesome -G awesome
USER awesome

# Copy libraries & meta-info & classes
COPY --from=build ${DEPENDENCY}/BOOT-INF/lib /app/lib
COPY --from=build ${DEPENDENCY}/META-INF /app/META-INF
COPY --from=build ${DEPENDENCY}/BOOT-INF/classes /app
# Run application
ENTRYPOINT ["java","-cp","app:app/lib/*","com.myawesomeness.Application"]

Тогда ваше приложение должно запускаться вне maven первый.

...