从 docker 文件中获取 pom.xml 中定义的文件名的最佳实践是什么?

Ozz*_*zzy 5 java maven docker spring-boot dockerfile

我正在为我的 Spring Boot 应用程序创建一个 docker 文件。

这是文件:

FROM openjdk:8-jdk-alpine
COPY eureka/target/eureka-1.0.jar app.jar
ENTRYPOINT ["java","-Djava.security.egd=file:/dev/./urandom","-jar","/app.jar"]
Run Code Online (Sandbox Code Playgroud)

jar 文件的名称(本例中为 eureka-1.0.jar)在 pom.xml 中定义

<artifactId>eureka</artifactId>
<version>1.0</version>
<packaging>jar</packaging>
Run Code Online (Sandbox Code Playgroud)

我的问题是;当我更改 pom 中的文件名时,我必须手动将更改反映到 docker 文件,这会破坏自动部署过程。

从 docker 文件中获取 pom.xml 中定义的文件名的最佳实践是什么?

(如果它对最佳实践很重要:有多个 docker 文件都与此文件类似,并且它们由 docker-compose.yml 使用)

khm*_*ise 6

通常你在 pom 文件中定义<finalName>来保持名称静态。

最终名称的默认定义如下:

 <build>
    <finalName>${project.artifactId}-${project.version}</finalName>
    ..
 </build>
Run Code Online (Sandbox Code Playgroud)

这意味着如果您发布工件等,您必须更改Dockerfile...最简单的解决方案是更改 pom 中的定义,例如:

 <build>
    <finalName>${project.artifactId}</finalName>
    ..
 </build>
Run Code Online (Sandbox Code Playgroud)

只有当你改变你的artifactId时你才需要改变Dockerfile,这通常不会经常发生......

更新

你可以做的是为你喜欢的人提供论据Dockerfile

#!/bin/bash
POM_VERSION=$(mvn -q help:evaluate -Dexpression=project.version -DforceStdout=true)
echo "POM Version: $POM_VERSION"
docker build --no-cache \
    --build-arg APPVERSION=$POM_VERSION \
    --rm=true -t user-registration .
Run Code Online (Sandbox Code Playgroud)

关于这一行的一句话:POM_VERSION=..maven-help-plugin 版本 3.1.0开始,可以从 pom 文件中提取内容,特别是在没有任何 grep/awk vodoo 的情况下。

Dockerfile 可能如下所示:

# FROM alpine:3.6 (plus Open JDK?)
FROM openjdk:8u131-jre-alpine
ARG APPVERSION
RUN echo "Building ${APPVERSION}"
RUN mkdir /usr/local/service/
COPY target/user-registration-${APPVERSION}.jar /usr/local/service/user-registration.jar
# 8080 application port
# 8081 admin port.
EXPOSE 10080 10081
CMD ["java", "-XX:MaxRAM=128m", "-jar", "/usr/local/service/user-registration.jar"]
Run Code Online (Sandbox Code Playgroud)

这里的问题很简单,CMD不支持 ENV,ARGS 扩展,这意味着您需要使用上面的版本进行复制。您可以在多个位置使用ARG,但不能在所有位置使用...