FROM openjdk:8
ENV TZ=Asia/Shanghai \
SPRING_OUTPUT_ANSI_ENABLED=ALWAYS \
WORK_PATH=tmp/data \
JAVA_OPTS="" \
APP_NAME=rocketmq-demo-0.0.1-SNAPSHOT.jar \
APP_VERSION=0.1
RUN ln -snf /usr/share/zoneinfo/$TZ /etc/localtime && echo $TZ > /etc/timezonemvn && mkdir $WORK_PATH -p
COPY ./$APP_NAME $WORK_PATH/app.jar
WORKDIR $WORK_PATH/ # 使用env作为WORKDIR的参数
ENTRYPOINT ["java","-Djava.security.egd=file:/dev/./urandom"]
CMD ["-jar", "app.jar"]
使用env作为WORKDIR的参数在使用DockerAPI进行创建镜像的时候会报错:cannot normalize nothing
预期pwd是:tmp/data/,但是最终解析成了 $WORK_PATH/
原因:
docker中的WORKDIR指令不是直接在shell中的 `cd` 命令,而是使用linux的系统调用进行文件路径的改变,这就会导致解析出错
解决方案:
使用ARG替换ENV
FROM openjdk:8
ARG WORK_PATH=tmp/data # 设置工作路径
ENV TZ=Asia/Shanghai \
SPRING_OUTPUT_ANSI_ENABLED=ALWAYS \
JAVA_OPTS="" \
APP_NAME=rocketmq-demo-0.0.1-SNAPSHOT.jar \ #指定生成的jar包名称
APP_VERSION=0.1 #设置app版本
RUN ln -snf /usr/share/zoneinfo/$TZ /etc/localtime && echo $TZ > /etc/timezonemvn
COPY target/$APP_NAME $WORK_PATH/app.jar
WORKDIR $WORK_PATH
ENTRYPOINT ["java","-Djava.security.egd=file:/dev/./urandom"]
CMD ["-jar", "app.jar"]