如何在Dockerfile中正确设置构建参数

时间:2019-08-31 00:04:18

标签: docker dockerfile

我在Dockerfile中有以下一行:

ARG COOL_ID
...
ENTRYPOINT ["java", "-jar", "/usr/share/java/${COOL_ID}/app.jar"]

但是当我运行它时,会出现错误:

Error: Unable to access jarfile /usr/share/java//app.jar

我可以看到我的${COOL_ID}参数的格式不正确。

我该如何解决?

1 个答案:

答案 0 :(得分:0)

它不会替代变量,因为Docker将ENTRYPOINTCMD视为命令,因此无法处理像shell这样的变量。尝试更改CMD以将其作为外壳程序运行,然后可以像处理外壳程序一样处理变量。

此外,您不能在CMD中使用ARG将它们视为环境变量,而只能在Dockerfile中使用它们,要将它们用作环境变量,必须将它们分配给某些ENV

ARG COOL_ID
ENV COOL_ID=$COOL_ID

我还将建议在Docker构建时验证并检查COOL_ID,如果未设置,则应向用户显示警告或错误,请参见以下示例,如果ARG未传递给构建参数然后它将向用户显示一条错误消息。

ARG COOL_ID
#see ARG is for build time 
RUN if [  -z $COOL_ID ];then \
  >&2 echo  "\n****************Warning!!!!*************\n"; \
  >&2 echo "COOL_ID seems empty!" ;\
  fi

ENV COOL_ID=$COOL_ID
# ENV is for run time
CMD ["sh", "-c", "java -jar /usr/share/java/${COOL_ID}/app.jar"]

现在使用--build-arg

构建docker。
docker build --build-arg COOL_ID=myid -t myjava .

如果您错过传递COOL_ID的权限,则会收到通知。

enter image description here