簡體   English   中英

入口點腳本中的 Docker exec 命令失敗

[英]Docker exec command in entrypoint script fails

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

您需要將 JSON-array-format 命令行分解為單獨的單詞。 由於您已明確告訴 Docker,其中的“命令”部分是一個單詞,因此它正在/usr/bin java -Dlog4j.configurationFile=...名為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 ,即使您沒有入口點包裝器。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM