我正在尝试运行一个使用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构建过程)
答案 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中的命令用作入口点,但我发现这种方式更简洁。