0

按照关于在 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- 这是什么意思?怎么了?

4

1 回答 1

1

您需要将 JSON-array-format 命令行分成单独的单词。由于您已明确告诉 Docker,其中的“命令”部分是一个单词,因此它会在/usr/binnamed中查找二进制文件java -Dlog4j.configurationFile=...,其中包含空格和选项以及所有文件名的一部分,但没有找到它。

您通常不想嵌入要在其中运行的命令ENTRYPOINT,尤其是在您使用此包装器布局时。将just 设为以;ENTRYPOINT结尾的脚本名称 exec "$@"它必须使用 JSON 数组语法。MakeCMD成为您要运行的实际命令,无论哪种语法更方便。(如果您尝试扩展环境变量,则面向 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,即使您没有入口点包装器。

于 2020-01-10T20:12:05.073 回答