Dockerfile的CMD不接受变量进行替换

7

无法在CMD命令行中使用变量:

#CMD ["/opt/jdk/bin/java", "-jar", "${ARTIFACTID}-${VERSION}.${PACKAGING}"]
CMD ["/opt/jdk/bin/java", "-jar", "ssltools-domain-LATEST.jar"]

最新的代码行有效,而第一行无效。

非常感谢任何帮助或解决方法。

2个回答

14

当您将参数写成JSON字符串形式传递给CMD(或ENTRYPOINT)时,例如...

CMD ["/opt/jdk/bin/java", "-jar", "ssltools-domain-LATEST.jar"]

...该命令直接使用 exec 系统调用执行,而不会通过 shell 处理。这意味着没有 I/O 重定向、通配符处理以及变量扩展。您可以通过多种方式解决此问题:

  • 您可以直接将其作为纯字符串编写,例如:

      CMD /opt/jdk/bin/java -jar ${ARTIFACTID}-${VERSION}.${PACKAGING}
    

    当参数不是JSON结构时,它会被传递给sh -c

    你可以像Philip建议的那样,自己将参数传递给sh -c

      CMD ["sh", "-c", "/opt/jdk/bin/java -jar ${ARTIFACTID}-${VERSION}.${PACKAGING}"]
    

    这两个选项基本上是相同的。

  • 第三个选项是将所有内容放入一个 shell 脚本中,然后运行它:

      COPY start.sh /start.sh
      CMD ["sh", "/start.sh"]
    

    如果你需要执行的不仅仅是简单的命令行,那么这将特别有用。


太好了,我也发现你传递给shell的变量必须是ENV而不是ARG。感谢你的shell脚本提示。将所有参数添加到一个脚本中并运行它将是最干净的方式。 ARG PACKAGING=jar ENV PACKAGING=${PACKAGING} - MortenB

2

首先尝试一下这个小技巧

CMD ["sh", "-c", "/opt/jdk/bin/java -jar ${ARTIFACTID}-${VERSION}.${PACKAGING}"]

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接