如何使用自定义变量运行Docker容器(使用Jenkins构建)

时间:2019-05-23 05:27:46

标签: docker jenkins jenkins-pipeline dockerfile docker-container

我正在尝试运行一个使用maven部署Java应用程序的Docker容器 在不使用docker的情况下,我用来部署的命令是 “ java -jar app-v0.1.jar”

由于我的应用程序版本倾向于更改,(app-v0.1,v0.2 ...)我通常要做的是运行 “ java -jar * .jar “ (工作文件夹中始终只有1个.jar文件)。这在本地有效。

但是,在构建Docker容器时,这似乎无法应用。这是我的dockerfile


  

从openjdk:8

     

WORKDIR / app

     

COPY * .jar。

     

CMD [“ java”,“-jar”,“ *。jar”]

     

博览会8181


我可以从该Dockerfile构建Docker映像。但是,当我尝试运行容器时,总是出现错误:无法访问jarfile * .jar。

我也尝试过:

  

复制目标/ *。jar。

     

RUN file =`find。 -name“ * .jar” -exec basename {} \;`

     

CMD [“ java”,“-jar”,“ $ {file}”]

返回错误:无法访问jarfile $ {file}

例如,如果我将“ * .jar”更改为特定名称,则

  

CMD [“ java”,“-jar”,“ app-v0.1.jar”]

一切正常。但是很明显,我不想每次应用程序中有代码更新时都更改Dockerfile。

有没有一种方法可以将变量放入Dockerfile中,例如“

  

CMD [“ java”,“-jar”,“ $ {filename} .jar”]   “?

(如果有帮助:我正在使用Jenkins管道自动化docker构建过程)

2 个答案:

答案 0 :(得分:0)

解决方案1:

使用ARG,请参见this

FROM openjdk:8

ARG filename
ENV jarname=${filename}

WORKDIR /app

COPY *.jar .

CMD java -jar ${jarname}

EXPOSE 8181

使用docker build --build-arg filename=a.jar xxx

解决方案2:

使用ENV,请参见this

FROM openjdk:8

ENV jarname=""

WORKDIR /app

COPY *.jar .

CMD java -jar ${jarname}

EXPOSE 8181

在容器运行docker run -e jarname=a.jar xxx时将env传递给

解决方案3:

在外壳中运行*

FROM openjdk:8

WORKDIR /app

COPY *.jar .

CMD java -jar *.jar

EXPOSE 8181

答案 1 :(得分:0)

我建议使用多阶段构建。

您的Dockerfile应该是:

FROM maven:3.6.0-jdk-8 as build

ARG BUILD_PROFILE=prod

WORKDIR /apps

COPY . .
RUN mvn --activate-profiles ${BUILD_PROFILE} clean install

FROM openjdk:8-jre
COPY --from=build /apps/target/*.jar ./
COPY startup.sh ./

RUN chmod +x ./*.sh
ENTRYPOINT ["/startup.sh"]

还有startup.sh

#!/usr/bin/env bash
java -Dspring.profiles.active=${RUN_PROFILE} -jar /app*.jar

通过这种方式,您还可以在执行docker build时构建应用程序。

注意 您也可以将startup.sh中的命令用作入口点,但我发现这种方式更简洁。