我正在为我的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使用)
发布于 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
,但不是在所有位置...
发布于 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文件中。
发布于 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
https://stackoverflow.com/questions/50896123
复制相似问题