initティニはあなたが考えることができる最も簡単なinitです。
ティニが行うのは、一人の子供を生み出し(ティニはコンテナで走ることを目的としています)、ゾンビを刈り取って信号転送を実行しながら、それがすべて終了するのを待ちます。
ティニの使用にはいくつかの利点があります。
SIGTERM信号ハンドラーを明示的にインストールしていなくても、プロセスを適切に終了します。なぜこれが役立つのかについての詳細が必要な場合は、この問題の議論を確認してください。ティニの利点は何ですか?
注:Docker 1.13以降を使用している場合、TiniはDocker自体に含まれています。これには、Docker CEのすべてのバージョンが含まれます。 Tiniを有効にするには、 docker runに--initフラグを渡すだけです。
注:Tiniで利用可能な事前に構築されたDocker画像があります。現在、ubuntuまたはcentos画像をベースとして使用している場合は、それらのいずれかをドロップインの代替品として使用できます。
注:Alpine LinuxとNixos用の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'場合は、 --を追加する必要があります。
Tini自体の引数は、次の例で-v /tini -v -- /your/programように渡す必要があります。
注:上記のバイナリは、64ビットの動的にリンクされたバイナリです。
tiniおよびtini-static Binariesは、Key 595E85A6B1B4779EA4DAAEC70B588DFF0527A9B7を使用して署名されています。
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 or Newer)では、次のコマンドを使用してTiniをインストールできます。
apt-get install tini
このインストール/usr/bin/tini (および/usr/bin/tini-static )、not /tiniあることに注意してください。
Arch Linuxには、AURで利用可能なパッケージがあります。公式の指示を使用してインストールするか、AURヘルパーを使用します。
pacaur -S tini
アームと32ビットのバイナリが利用可能です! [リリース]タブの下に、利用可能なバイナリの完全なリストを見つけることができます。
-v引数は、余分な冗長出力に使用できます(たとえば、 -vvvまで3回まで渡すことができます)。
デフォルトでは、Tiniはゾンビを刈り取ることができるようにPID 1として実行する必要があります(PID 1として走ることにより、ゾンビはティニに再格闘されます)。
何らかの理由で、TiniをPID 1として実行できない場合は、代わりにTiniをプロセスサブリーパーとして登録する必要があります(Linux> = 3.4でのみ)。
-s引数をTiniに渡す( tini -s -- ... )TINI_SUBREAPER設定(例: export TINI_SUBREAPER= )。これにより、ゾンビはティニがPID 1として走っていないにもかかわらず、ティニに再格闘されることを保証します。
注:Tiniは、PID 1として実行されておらず、サブレーパーとして登録されていないことを検出した場合、警告を発します。警告が表示されない場合は大丈夫です。
Tiniは、終了するときに子供の出口コードを再利用しますが、時々、これはあなたが望むものではないかもしれません(たとえば、あなたの子供がSigtermを受け取った後に143で終了する場合)。特に、これはJavaアプリの問題になる可能性があります。
この場合、 -eフラグを使用して任意の出口コードを0に再マップします。必要に応じてフラグを複数回渡すことができます。
例えば:
tini -e 143 -- ...
デフォルトでは、ティニは即時の子プロセスのみを殺します。このプロセスに信号を送信しても、望ましい効果がない場合、これは不便です。たとえば、そうする場合
docker run krallin/ubuntu-tini sh -c 'sleep 10'
Ctrl-Cそれは何も起こりません。Sigintは「Sh」プロセスに送られますが、「睡眠」が終了するのを待っている間、そのシェルはそれに反応しません。
-gオプションを使用すると、Tiniは子どものプロセスグループを殺し、グループ内のすべてのプロセスが信号を取得します。これは、端末でCTRL-Cなどを行うときに起こることに近いものに対応します。信号は前景プロセスグループに送信されます。
Tiniは親の死の信号を設定できます。これは、Tiniが親が出るときに受け取る信号です。親の死の信号を設定するには、親が出るときにティニの名前を付けて-pフラグを使用します。
tini -p SIGTERM -- ...
注:親の死の信号とユースケースの詳細については、このPRのディスカッションを参照してください。
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をサポートしている場合は、子サブリーピャーもサポートする必要があります)。
プロセスを生み出した後、ティニは信号を待って、それらを子プロセスに転送し、定期的にコンテナ内で作成できるゾンビプロセスを刈り取ります。
「最初の」子のプロセスが終了すると( /your/program )、ティニは子どものプロセスの出口コードを使用して終了します(そのため、コンテナの出口コードを確認して、子供が正常に出るかどうかを知ることができます)。
あなたが期待するように何かが機能していない場合は、冗長レベルを上げることを検討してください(最大3)
tini -v -- bash -c 'exit 1'
tini -vv -- true
tini -vvv -- pwd
メンテナー:
貢献者:
特別な感謝: