init Tini是您可以想到的最簡單的init 。
Tini所做的就是產生一個孩子(Tini打算在容器中運行),並等待它在收集殭屍並執行信號轉發的同時退出。
使用Tini有幾個好處:
SIGTERM可以正確終止您的過程,即使您沒有明確安裝信號處理程序。如果您想更多有關為什麼有用的詳細信息,請查看此問題討論:Tini的優勢是什麼?
注意:如果您使用的是Docker 1.13或更高的時間,則Tini本身包含在Docker本身中。這包括所有版本的Docker CE。要啟用tini,只需將--init標誌傳遞到docker run即可。
注意:有可用於Tini的預製碼頭圖像。如果您當前使用Ubuntu或CentOS圖像作為基礎,則可以將其中一個用作置換式替代品。
注意:有用於高山Linux和Nixos的Tini軟件包。有關安裝說明,請參見下文。
將Tini添加到您的容器中,並使其可執行。然後,只需調用Tini,然後將您的程序及其論點作為論點傳遞給Tini。
在Docker中,您將需要使用入門點,因此您不必記住手動調用Tini:
# Add Tini
ENV TINI_VERSION v0.19.0
ADD https://github.com/krallin/tini/releases/download/${TINI_VERSION}/tini /tini
RUN chmod +x /tini
ENTRYPOINT ["/tini", "--"]
# Run your program under Tini
CMD ["/your/program", "-and", "-its", "arguments"]
# or docker run your-image /your/program ...
請注意,您可以跳過--在某些條件下,但您也可以始終將其包含在安全的情況下。如果您看到一條看起來像tini: invalid option -- 'c' ,則需要添加-- 。
在下面的示例中,應像-v一樣傳遞Tini本身的/tini -v -- /your/program program 。
注意:上面鏈接的二進制是一個64位動態鏈接的二進制。
使用密鑰595E85A6B1B4779EA4DAAEC70B588DFF0527A9B7簽署tini和tini-static二進製文件。
您可以使用gpg驗證其簽名(您可以使用軟件包管理器安裝):
ENV TINI_VERSION v0.19.0
ADD https://github.com/krallin/tini/releases/download/${TINI_VERSION}/tini /tini
ADD https://github.com/krallin/tini/releases/download/${TINI_VERSION}/tini.asc /tini.asc
RUN gpg --batch --keyserver hkp://keyserver.ubuntu.com:80 --recv-keys 595E85A6B1B4779EA4DAAEC70B588DFF0527A9B7
&& gpg --batch --verify /tini.asc /tini
RUN chmod +x /tini
tini和tini-static二進製文件產生了校驗和SHA1和SHA256 。
您可以使用sha1sum和sha256sum驗證他們的校驗和(您可以使用軟件包管理器安裝):
ENV TINI_VERSION v0.19.0
RUN wget --no-check-certificate --no-cookies --quiet https://github.com/krallin/tini/releases/download/${TINI_VERSION}/tini-amd64
&& wget --no-check-certificate --no-cookies --quiet https://github.com/krallin/tini/releases/download/${TINI_VERSION}/tini-amd64.sha256sum
&& echo "$(cat tini-amd64.sha256sum)" | sha256sum -c
在Alpine Linux上,您可以使用以下命令安裝Tini:
RUN apk add --no-cache tini
# Tini is now available at /sbin/tini
ENTRYPOINT ["/sbin/tini", "--"]
使用NIX,您可以使用以下命令安裝Tini:
nix-env --install tini
在Debian(Buster或更新)上,您可以使用以下命令安裝Tini:
apt-get install tini
請注意,此安裝/usr/bin/tini (和/usr/bin/tini-static ),而不是/tini 。
在Arch Linux上,AUR上有一個包裝。使用官方說明安裝或使用AUR助手:
pacaur -S tini
提供手臂和32位二進製文件!您可以在“版本”選項卡下找到可用的二進製文件的完整列表。
-v參數可用於額外的詳細輸出(您最多可以將其傳遞3次,例如-vvv )。
默認情況下,Tini需要以PID 1的速度運行,以便它可以收穫殭屍(通過以PID 1運行,殭屍將重新分配給Tini)。
如果出於某種原因,您不能以PID 1的形式運行Tini,則應通過以下方式註冊Tini作為一個過程(僅在Linux> = 3.4)中。
-s論點傳遞給蒂尼( tini -s -- ... )TINI_SUBREAPER (例如export TINI_SUBREAPER= )。這將確保儘管蒂尼(Tini)並未以PID 1的速度運行,但殭屍將重新分配給Tini。
注意:如果Tini檢測到它沒有以PID 1的形式運行並且未註冊為子育,則將發出警告。如果您看不到警告,那就很好。
Tini在退出時會重複使用孩子的退出代碼,但偶爾,這可能不是您想要的(例如,如果您的孩子在收到Sigterm後143次退出)。值得注意的是,這可能是Java應用程序的問題。
在這種情況下,您可以使用-e標誌將任意退出代碼重新映射到0。如果需要,可以多次傳遞標誌。
例如:
tini -e 143 -- ...
默認情況下,Tini僅殺死其直接的兒童進程。如果向該過程發送信號沒有所需的效果,這可能是不便的。例如,如果您這樣做
docker run krallin/ubuntu-tini sh -c 'sleep 10'
和Ctrl-c,什麼也沒有發生:Sigint被發送到“ SH”過程,但是當它在等待“睡眠”完成時,該外殼不會對其做出反應。
使用-g選項,Tini殺死了兒童過程組,因此組中的每個過程都會獲得信號。這更接近地對應於您在終端中進行CTRL-C等時發生的情況:信號發送到前景過程組。
Tini可以設置其母體死亡信號,這是Tini的父母退出時應收到的信號。要設置父人死亡信號,請使用帶有信號tini的名稱的-p標誌在其父母退出時應收到的信號:
tini -p SIGTERM -- ...
注意:請參閱此公關討論,以了解有關父母死亡信號和用例的更多信息。
Tini也可以與容器中的現有入口點一起使用!
假設您的入口點是/docker-entrypoint.sh ,那麼您將使用:
ENTRYPOINT ["/tini", "--", "/docker-entrypoint.sh"]
Tini的依賴項很少(僅取決於LIBC),但是如果您的容器無法啟動,則可能需要考慮使用靜態構建版本:
ADD https://github.com/krallin/tini/releases/download/${TINI_VERSION}/tini-static /tini
Tini是一個很小的文件(在10KB範圍內),因此它不會為您的容器增加太大的重量。
靜態鏈接的版本更大,但仍然<1m。
如果您不想下載二進製文件,則可以通過運行cmake . && make 。
在構建之前,您可能還想運行:
export CFLAGS="-DPR_SET_CHILD_SUBREAPER=36 -DPR_GET_CHILD_SUBREAPER=37"
這樣一來,即使您是在具有舊Linux內核標頭的系統上構建的(<3.4),Tini也會以兒童亞品為支持。如果您要與Docker一起使用Tini,這通常是您想要的(如果您的主機內核支持Docker,它也應支持子族子派生)。
產卵後,Tini將等待信號並將這些信號轉發到子過程中,並定期收穫可能在您的容器中創建的殭屍過程。
當“第一個”子進程退出(上面的示例中的/your/program )時,Tini也會退出,並在子進程的退出代碼(因此,您可以檢查容器的退出代碼以了解孩子是否成功地退出)。
如果某件事不像您期望的那樣工作,請考慮提高詳細水平(最多3):
tini -v -- bash -c 'exit 1'
tini -vv -- true
tini -vvv -- pwd
維護者:
貢獻者:
特別感謝: