我试图运行一个使用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构建过程)
解决方案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
我建议使用多阶段构建。
你的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服务?