我是java和maven的新手。我已经构建了一个执行 flink 作业的应用程序。我已经创建了一个基本的 docker 映像,但我不确定如何像在终端中运行应用程序一样执行/运行。
我目前在终端中运行应用程序,如下所示:
mvn package exec:java `-D exec.args="--runner=FlinkRunner --flinkMaster=localhost:8081 --filesToStage=.targetmaven_benchmark-1.0-SNAPSHOT-jar-with-dependencies.jar `" -P flink-runner`
这是我的码头工人文件
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"]
有什么建议吗?
提前感谢!
您正在使用 maven 插件和 maven 配置文件运行您的应用程序。首先,您需要在 maven 之外运行您的应用程序。
然后,您需要稍微清理一下docker步骤,这里有一些建议:
- 在coyping pom和下载依赖项后移动复制src
- 不要将 root 用户用于可运行的映像
- 对可运行映像使用更纤细的基础映像
- 使用爆炸罐而不是胖罐子来获得更纤薄的层 数
- 利用 .dockerignore 来防止将不需要的东西复制到映像中
下面是一个示例 Dockerfile:
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 之外运行。