我在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}
参数的格式不正确。
我该如何解决?
答案 0 :(得分:0)
它不会替代变量,因为Docker将ENTRYPOINT
和CMD
视为命令,因此无法处理像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 build --build-arg COOL_ID=myid -t myjava .
如果您错过传递COOL_ID的权限,则会收到通知。