Docker exec命令在入口脚本中失败。

10 浏览
0 Comments

Docker exec命令在入口脚本中失败。

根据在CMD之前执行脚本上的建议(我需要在重新启动容器之前清除临时目录以修复一个错误),我修改了我的Docker文件,将CMD更改为entrypoint如下:

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"]

在entrypoint文件的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 - 这是什么意思?出了什么问题?

0
0 Comments

问题的出现原因是在ENTRYPOINT脚本中使用了命令行的JSON数组格式,导致了执行失败。由于在ENTRYPOINT中明确告诉Docker,“command”部分是一个单词,它会在/usr/bin目录中寻找一个名为java -Dlog4j.configurationFile=...的二进制文件,将空格和选项作为文件名的一部分,但是找不到这个文件。

解决方法是将JSON数组格式的命令行拆分为单独的单词。通常情况下,不建议将要运行的命令嵌入到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来设置启动应用程序的命令。

解决方法有效,谢谢!不过,我仍然不明白为什么会这样..这似乎不是一个明确记录的功能,更像是一种hack。

0