s6-overlay」タグアーカイブ

docker-jitsi-meetのENTRYPOINT

この記事は【2020年12月7日】と作成から2年以上経っているため、記事の内容が古い可能性があります。最新の情報を合わせてご確認されることを推奨いたします。

docker-jitsi-meetのbaseコンテナイメージ指定されている/initスクリプトは何だろうと思い調べた内容である。結論から言うと、s6というスーパバイザプログラムでプロセスを実行している。

entrypoint /init

s6 overlay

s6 overlayは、s6というunix系のスーパバイザツールをベースとしたDockerイメージ作成のためのツールセットのことらしい。s6は、daemontoolsやrunitのようなスーパバイザツールである。
Dockerfileのサンプルは以下のようになる。

ENTRYPOINTは/initというスクリプトとなる。s6 overlayツールは、プロセス実行のライフサイクルをステージという単位で扱いプロセス実行している。docker-jitsi-meetは上記をbaseイメージとして使用し、各種サービスのコンテナイメージをbaseイメージから派生させ作成している。

s6 overlayのステージ

以下の初期ステージ、実行ステージ、終了ステージ、の3つのステージで構成される。

stage 1

イメージの準備ステージ。具体的には環境変数の設定などである。

stage 2

ユーザ提供のファイルが実行されるステージ。
  • /etc/fix-attrs.dで所有者やパーミッションなどの設定
  • /etc/cont-init.dのスクリプト実行
  • /etc/services.dのサービスを実行しs6が監視を開始

stage 3

終了処理のステージ、プロセスのclean upと停止処理が行われる。
  • /etc/cont-finish.dでfinalize処理
  • SIGTERMでgracefulシャットダウン、SIGKILLで強制停止
基本的には、stage2と3のxxx.dで実行されるフックを使用し目的のプログラムを実行する感じになる。
試しに実行してみよう。

コンソールログから、ステージのライフサイクルを確認できる。また、実行したshは、s6-svscanというプロセスの管理下に置かれていることが分かる。s6-svscanに関する内容は以下にある。
参考)s6-svscan

s6 overlayを使ったイメージ作成と実行

単純な文字列を出力するだけのアプリを動かすイメージを作成する。

ファイル構成

  • etc下にs6で必要となるリソースを配置する。すべてのステージのファイルは必要ではないが、サンプルでは用意する。
  • app下にアプリケーションを置く。今回は、単なるsleepするシェルスクリプトである。

Dockerfileとdocker-compose.yaml

Dockerfile
s6 overlayのインストールとユーザ作成、/initを実行するだけのDockerfileである。

docker-compose.yaml
ホスト側のフックのためのスクリプトを配置したディレクトリをマウントする。

s6 overlayのリソース
etc/fix-attrs.d/01-myattr

これは、以下の形式で記述している。/appディレクトリに対する所有者及びパーミッションを設定している。

参考
etc/cont-init.d/01-config

shebangで指定しているwith-contentというプログラムでは、コンテナの環境変数を構築しexecコマンドで引数で指定されるプログラムを実行している。
etc/services.d/myapp1/run

etc/services.d/myapp1/finish

etc/services.d/myapp2/run

etc/services.d/myapp2/finish

etc/cont-finish.d/

app
単なるsleepするだけのシェルスクリプト。
app/myapp1

app/myapp2

イメージの実行

作成したイメージとアプリを実行してみる。

このプログラムを実行すると、myapp1とmyapp2が終了しても繰り返しプロセスが実行されることが分かる(通常のサーバープログラムは、上記例のようにすぐにプロセスが終了することはない)。s6-svscanによるスーパバイザが機能していることが上記例から分かる。

終了させる場合は、以下のようにできる。

コンテナのログには以下のように表示される。

その他

initやinit-stageXのスクリプトは、execlineというスクリプト言語で記述されている。シェルのようだがシェルとは異なる。コマンド実行に有用な機能が備わっている。
execline

参考リンク