如下 Dockerfile 文件中:

#基础镜像,如果本地没有,会从远程仓库拉取。
#FROM openjdk:8-jdk-slim
#FROM docker.io/store/oracle/serverjre:8
FROM xzxiaoshan/dockerssh:oracle_serverjre_8

#镜像的制作人
LABEL MAINTAINER=365384722@qq.com

#工作目录
WORKDIR /app/

#在容器中创建挂载点,可以多个
VOLUME ["/tmp"]

#声明了容器应该打开的端口并没有实际上将它打开
EXPOSE 8080

#定义参数(build构建时使用)
ARG JAR_FILE=app.jar
ARG BRANCH
ARG ENV=dev

#设置环境变量(程序运行时使用)
ENV JAVA_OPTS=""
ENV PARAMS=""

#拷贝本地文件到镜像中
COPY ${JAR_FILE} app.jar

#指定容器启动时要执行的命令,但如果存在CMD指令,CMD中的参数会被附加到ENTRYPOINT指令的后面
ENTRYPOINT ["java", "$JAVA_OPTS", "-Djava.awt.headless=true -Djava.security.egd=file:/dev/./urandom","-jar", "app.jar", "$PARAMS"]

本意是想在 entrypoint 执行的命令中添加变量参数 JAVA_OPTS 和 PARAMS,如果按照这样写,变量是不被解析的,会报错。

那么正确的写法是使用 sh -c 命令来执行后面的命令,示例如下:

ENTRYPOINT ["sh", "-c", "java $JAVA_OPTS -Djava.awt.headless=true -Djava.security.egd=file:/dev/./urandom -jar app.jar $PARAMS"]

(END)

Logo

权威|前沿|技术|干货|国内首个API全生命周期开发者社区

更多推荐