使用 RegEx 将特定的 Maven 构建工件复制到 Dockerfile

问题描述 投票:0回答:3

我正在构建一个 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 maven cicd
3个回答
0
投票

快速回答

复制所有目标内容,然后使用简单的 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

Docker 多阶段

基本上,您可以创建一个临时映像,其中包含 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"]

0
投票

您可以使用 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
投票

对于要复制名称以数字结尾的文件的情况,请执行以下操作:

我的应用程序-“*[0-9]”.jar

© www.soinside.com 2019 - 2024. All rights reserved.