首页
学习
活动
专区
工具
TVP
发布
社区首页 >问答首页 >从docker文件中获取pom.xml中定义的文件名的最佳实践是什么?

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

Stack Overflow用户
提问于 2018-06-17 19:17:57
回答 3查看 2.1K关注 0票数 4

我正在为我的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"]

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

<artifactId>eureka</artifactId>
<version>1.0</version>
<packaging>jar</packaging>

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

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

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

EN

回答 3

Stack Overflow用户

发布于 2018-06-17 19:23:32

通常,您在pom文件中定义<finalName>以使名称保持静态。

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

 <build>
    <finalName>${project.artifactId}-${project.version}</finalName>
    ..
 </build>

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

 <build>
    <finalName>${project.artifactId}</finalName>
    ..
 </build>

只有当你改变你的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 .

关于这一行有一句话:POM_VERSION=..maven-help-plugin version 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"]

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

票数 3
EN

Stack Overflow用户

发布于 2018-06-18 02:46:18

如果您的docker文件也位于Maven项目中,则可以使用Maven Resources插件进行过滤。

假设您的docker文件在src/main/docker

将该文件夹添加为pom.xml中的“资源”文件夹:

<resource>
  <directory>src/main/docker</directory>
  <filtering>true</filtering>
</resource>

在docker文件中,使用${project.artifactId}-${project.version}.jar。在构建jar文件时,target文件夹将包含替换了变量的Docker文件。

之后,您可以使用Maven Assembly插件将包含docker-compose文件的所有docker文件与您的jar文件放在一个zip文件中,以获得一个完整的包。

缺点是Docker文件也会在jar文件中。

更新:使用Maven Assembly插件本身(https://maven.apache.org/plugins/maven-assembly-plugin/examples/single/filtering-some-distribution-files.html)的过滤,您可以避免Docker文件在jar文件中。

票数 2
EN

Stack Overflow用户

发布于 2021-01-17 17:05:08

在pom file @dockerfile maven插件中,在配置标签内添加以下行,然后添加buildargs标签${project.version}

在dockerfile中添加以下行--> ARG PROJECT_VERSION

复制eureka/target/eureka-${PROJECT_VERSION}.jar app.jar

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/50896123

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档