当前位置: 首页 > 知识库问答 >
问题:

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

狄阳华
2023-03-14

我试图运行一个使用maven部署java应用程序的docker容器。如果不使用docker,我用来部署的命令是“java-jarapp-v0.1.jar”

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

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

从openjdk: 8

WORKDIR/app

复制*. jar.

CMD[“java”、“-jar”、“*.jar”]

暴露8181

我可以从Dockerfile创建docker映像。但当我尝试运行容器时,总是会出现错误:无法访问jarfile*。罐子

我还尝试:

复制目标/*。罐子

运行file=`find-名称“*.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个答案

海嘉赐
2023-03-14

解决方案1:

使用ARG,请参见以下内容:

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,请参见以下内容:

FROM openjdk:8

ENV jarname=""

WORKDIR /app

COPY *.jar .

CMD java -jar ${jarname}

EXPOSE 8181

传递env到当容器运行docker运行-e jarname=a.jarxxx

解决方案3:

使*在shell中工作:

FROM openjdk:8

WORKDIR /app

COPY *.jar .

CMD java -jar *.jar

EXPOSE 8181
桑思远
2023-03-14

我建议使用多阶段构建。

你的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

注意:您也可以在启动时使用该命令。sh作为你的入口,但我觉得这样更干净。

 类似资料:
  • 问题内容: 我有一个Dockerfile和自定义Nginx配置文件(与Dockerfile位于同一目录中),如下所示: Dockerfile: nginx.conf文件: 我运行以下两个命令: 然后,我签出了所有正在运行的容器,但没有显示出来。当我搜索nginx容器的日志时,发现以下错误消息: [emerg] 1#1:/etc/nginx/nginx.conf中的未知指令“上游”:1 nginx:

  • 问题内容: 我面临以下问题:我创建了一个Jenkins Docker容器,并将主机上的Docker套接字与该容器链接。像这样: 然后,当我尝试在詹金斯上创建一些作业时,我收到通常的“权限被拒绝”消息: 尝试在unix:///var/run/docker.sock上连接到Docker守护程序套接字时获得的权限被拒绝:获取 http://%2Fvar%2Frun%2Fdocker.sock/v1.29

  • 找到价格最高和最低的信息: mysql> SELECT @min_price:=MIN(price),@max_price:=MAX(price) FROM shop; mysql> SELECT * FROM shop WHERE [email protected]_price OR [email protected]_price; +---------+--------+-------+ |

  • 有没有人在使用环境变量开始的customer Docker实例部署Azure Webapps方面有一些经验?

  • 从这个链接中,我发现Google Cloud Dataflow使用Docker容器为其工作人员:Google Cloud Dataflow实例的图像 我看到有可能找到docker容器的映像名称。 但是,有没有一种方法可以获取这个docker容器(即从哪个存储库获取它?),修改它,然后指示我的数据流作业使用这个新的docker容器? 我问的原因是我们需要在我们的docker上安装各种C和Fortra

  • 在运行容器之后,我应该如何更改我的Dockerfile以使其具有一个正在运行的MySQL服务?