我有一個Dockerfile結尾:
ENTRYPOINT ["java", "org.springframework.boot.loader.JarLauncher"]
現在我想在此之前從 shell 腳本運行一些初始化。所以我必須將其重構為:
ENTRYPOINT[ /entrypoint.sh]
和:
!#/bin/bash
echo "some init"
#TODO
#ENTRYOINT["java", "org.springframework.boot.loader.JarLauncher"]
問題:我如何才能真正模擬 shell 腳本中的 java 入口點?
uj5u.com熱心網友回復:
可以編輯 ShellScript 以運行正常的 Java 檔案。
從泊塢窗檔案:
如果您需要為單個可執行檔案撰寫啟動腳本,您可以使用 exec 確保最終的可執行檔案接收到 Unix 信號
!#/bin/bash
echo "some init"
#Execute using linux 'exec' Java launcher
exec java org.springframework.boot.loader.JarLauncher
uj5u.com熱心網友回復:
TL;DR:如果入口點包裝器以行結尾exec "$@",那么它將運行影像的CMD. 如果你改變ENTRYPOINT你現在擁有的,CMD那么你就不必在腳本中硬編碼它。
在您現在擁有的普通 Dockerfile 中,您可以更改ENTRYPOINT為CMD不影響您使用容器的方式。
FROM openjdk:17
...
# not ENTRYPOINT
CMD ["java", "org.springframework.boot.loader.JarLauncher"]
就其本身而言,這為您提供了一些靈活性;例如,可以直接查看容器內部,或者啟動互動式 shell 而不是正常的容器行程。
docker run --rm my-image ls /app
docker run --rm -it my-image sh
現在,如果你有CMD這種方式,你可以ENTRYPOINT相當直接地添加一個包裝腳本。 被作為附加引數CMD傳遞給 ,ENTRYPOINT并且 shell 呼叫exec "$@"將運行作為 . 傳遞的任何內容CMD。
#!/bin/sh
# entrypoint.sh
echo "some init"
touch /init-has-happened
exec "$@"
重要的是,這適用于我上面顯示的替代docker run命令。備用docker run命令替換 Dockerfile CMD,但保持ENTRYPOINT包裝器完好無損,因此備用命令在最后的exec "$@"行中運行。
docker run --rm my-image ls -l /init-has-happened
# the file will exist because the entrypoint wrapper creates it
轉載請註明出處,本文鏈接:https://www.uj5u.com/qiye/461186.html
上一篇:Dockerize一個AngularCli應用程式,但沒有附加任何內容
下一篇:如何計算python中的季節性?
