如何 运行 docker 带有自定义变量的容器(使用 Jenkins 构建)

How to run docker container with custom variable (Built with Jenkins)

我正在尝试 运行 一个使用 Maven 部署 java 应用程序的 docker 容器 不使用docker,我用来部署的命令是"java -jar app-v0.1.jar"

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

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


FROM openjdk:8

WORKDIR /app

COPY *.jar .

CMD ["java", "-jar", "*.jar"]

EXPOSE 8181


我可以从那个 Docker 文件构建 docker 图像。但是当我尝试 运行 容器时,我总是得到 Error: Unable to access jarfile *.jar.

我也试过:

COPY target/*.jar .

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

CMD ["java", "-jar", "${file}"]

哪个 returns 错误:无法访问 jarfile ${file}

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

CMD ["java", "-jar", "app-v0.1.jar"]

一切正常。但很明显,我不想每次在我的应用程序中进行代码更新时都更改我的 Docker 文件。

有什么方法可以将变量放入 Docker 文件中,比如“

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

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

方案一:

使用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

方案二:

使用ENV,参见this:

FROM openjdk:8

ENV jarname=""

WORKDIR /app

COPY *.jar .

CMD java -jar ${jarname}

EXPOSE 8181

将环境传递给 when 容器 运行 docker run -e jarname=a.jar xxx

方案三:

使 * 在 shell 中工作:

FROM openjdk:8

WORKDIR /app

COPY *.jar .

CMD java -jar *.jar

EXPOSE 8181

我建议使用 multi-stage 构建。

您的 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 构建时构建应用程序。

注意 您也可以使用 startup.sh 中的命令作为您的入口点,但我发现这样更干净。