入口点脚本中的Docker exec命令失败

时间:2020-01-10 18:57:45

标签: shell docker environment-variables docker-entrypoint

按照Execute a script before CMD的建议(我需要在重新启动容器之前清除临时目录,以修复错误),我将docker文件从使用CMD修改为入口点,如下所示:

ENTRYPOINT ["/app/entrypoint.sh", "/usr/bin/java -Dlog4j.configurationFile=/app/resources/LINUX/${LOG4J_FILE} -Dpa.config=/app/resources/LINUX/${CONFIG_FILE} -jar /app/app.jar"]

并在rm -rf命令之后进入入口点文件:

exec "$@"

但是docker无法启动容器,它退出了,容器日志显示:

+ exec '/usr/bin/java -Dlog4j.configurationFile=/app/resources/LINUX/${LOG4J_FILE} -Dpa.config=/app/resources/LINUX/${CONFIG_FILE} -jar /app/app.jar' /app/entrypoint.sh: line 7: /usr/bin/java -Dlog4j.configurationFile=/app/resources/LINUX/${LOG4J_FILE} -Dpa.config=/app/resources/LINUX/${CONFIG_FILE} -jar /app/app.jar: No such file or directory-这是什么意思?怎么了?

1 个答案:

答案 0 :(得分:1)

您需要将JSON-array-format命令行拆分为单独的单词。由于您已经明确告诉Docker,其中的“命令”部分是一个单词,因此它正在/usr/bin中寻找一个名为java -Dlog4j.configurationFile=...的二进制文件,其中的空格和选项都作为文件名,但找不到它。

通常,您不想将要运行的命令嵌入ENTRYPOINT中,尤其是在使用此包装器布局时。使ENTRYPOINT成为以exec "$@"结尾的脚本的名称;它必须使用JSON数组语法。使CMD成为您要运行的实际命令,无论哪种语法都更方便。 (如果您尝试扩展环境变量,则面向shell的语法可能会更好。)

ENTRYPOINT ["/app/entrypoint.sh"]
CMD /usr/bin/java \
  -Dlog4j.configurationFile=/app/resources/LINUX/${LOG4J_FILE} \
  -Dpa.config=/app/resources/LINUX/${CONFIG_FILE} \
  -jar /app/app.jar

我发现这种模式非常普遍且有用,因此我通常建议仅将ENTRYPOINT用于这种包装脚本;宁愿使用命令以CMD的身份启动应用程序,即使您没有入口点包装器也是如此。