我正在构建一个 Maven 项目,构建完成后,其中
target
文件夹如下所示:
target
|____ my-application-1.0.0-SNAPSHOT.jar
|____ my-application-1.0.0-SNAPSHOT-javadoc.jar
|____ my-application-1.0.0-SNAPSHOT-sources.jar
|____ my-application-1.0.0-SNAPSHOT.jar.original
我想对这个应用程序进行 dockerize,为此我使用的是
Jenkinsfile
,它应该仅将 my-application-1.0.0-SNAPSHOT.jar
复制到我的 Dockerfile
的目录中。
我构建了一个仅捕获
my-application-1.0.0-SNAPSHOT.jar
而不是其他 JAR 的正则表达式,但问题是 cp
不支持正则表达式。
有没有办法使用正则表达式复制文件?我正在使用
bash
。我尝试使用 find
并且它有效,但如果未找到文件,它不会抛出错误。不过,我绝对需要一个在这种情况下引发错误的解决方案。
这是我的解决方案,因此由我的
Jenkinsfile
执行:
sh """
find ./path/to/target -type f -regextype posix-egrep \
-regex './path/to/target/my-application-${versionRegex}\\.jar' \
-exec cp {} ./path/to/dockerfile \;
"""
versionRegex
是一个变量,定义如下:
def versionRegex = "[0-9]{2}\\.[0-9]{1,2}\\.[0-9]+(-(a[0-9]+-[0-9]{2}|SNAPSHOT|m[0-9]{2}|rc[0-9]{2}|[A-Z]+[a-zA-Z]*))?"
复制所有目标内容,然后使用简单的 bash 命令删除其他文件
不使用 docker 或使用其他工具进行构建并且仅传递构建结果并不是常见的方法。您可以使用 docker 多阶段
在 docker 中构建并运行整个 java 应用程序无论如何我都会列出一些选项给你
FROM ubuntu
RUN mkdir /server
COPY target/* /tmp
RUN cp /tmp/*SNAPSHOT.jar /server
RUN ls -la /server
基本上,您需要将所有目标内容复制到 /tmp 文件夹,然后仅从 /tmp 复制所需的 jar 到 /server
基本上,您可以创建一个临时映像,其中包含 Maven 以及构建 Java 应用程序所需的一切。然后,在另一个最终映像中,您仅复制前一个映像中所需的 jar。最终的图像很轻,因为只有构建的 jar,没有 maven、ant 等
这里有一个完整的 Dockerfile,用于构建和运行 Spring Boot 应用程序
FROM openjdk:8-jdk AS packager
ARG MAVEN_VERSION=3.5.2
ARG USER_HOME_DIR="/root"
# set as env vars to be reused inside dockerfile and app instance....
ENV MAVEN_HOME /usr/share/maven
ENV MAVEN_CONFIG "$USER_HOME_DIR/.m2"
# Install Maven and basic tools:
RUN apt-get update\
&& apt-get install -y curl\
&& rm -rf /var/lib/apt/lists/*
RUN mkdir -p /usr/share/maven && \
curl -fsSL http://www-eu.apache.org/dist/maven/maven-3/3.3.9/binaries/apache-maven-3.3.9-bin.tar.gz | tar -xzC /usr/share/maven --strip-components=1 && \
ln -s /usr/share/maven/bin/mvn /usr/bin/mvn
# prepare local project folder structure:
ENV PROJ_DIR=/usr/src/app
RUN mkdir -p $PROJ_DIR
COPY . $PROJ_DIR
WORKDIR $PROJ_DIR
# first build of the project, to create a binary version for next build stage
RUN ["mvn", "clean", "package"]
ENV BUILD_DIR=/usr/app
RUN mkdir -p $BUILD_DIR
RUN for i in `find $PROJ_DIR/target -name "*.jar" -print`; do cp -r $i $BUILD_DIR/app.jar ;done
RUN ls -la $BUILD_DIR
# THIRD STAGE: to package a release image with a smaller footprint
FROM openjdk:8-jdk as installer
ARG app_port=8080
ENV app_port=$app_port
EXPOSE $app_port
# copy the app binaries from previous build stage:
COPY --from=packager /usr/app /usr/app
# plumb the entrypoint for prod container:
ENTRYPOINT ["java", "-jar", "/usr/app/app.jar"]
您可以使用 GLOB 代替正则表达式。
它可能不太熟悉,但在这种情况下,您将有内置检查未找到。
对于您眼前的问题,您可以使用:
my-application-+([0-9]).+([0-9]).+([0-9])@(-SNAPSHOT|-rc01|).jar
地点:
+([0-9])
匹配任意数量 (>0) 的数字。就像正则表达式中的 \d+
,@(-SNAPSHOT|-rc01|)
匹配任何 -SNAPSHOT
、-rc01
或不匹配任何内容。就像正则表达式中的 (-SNAPSHOT|-rc01|)
或 (-SNAPSHOT|-rc01)?
。对于要复制名称以数字结尾的文件的情况,请执行以下操作:
我的应用程序-“*[0-9]”.jar