如何 运行 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 中的命令作为您的入口点,但我发现这样更干净。
我正在尝试 运行 一个使用 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 中的命令作为您的入口点,但我发现这样更干净。