Devcontainerでsystemdが動くコンテナを起動する
VS CodeのDevcontainerでsystemdが動くコンテナを起動する方法を記します。
今回作成した環境(CentOS 7, Ubuntu 22.04, Red Hat Universal Base Image 9)は下記リポジトリで公開しています。
実施すること
Dockerfile側とdevcontainer.json側のそれぞれで設定が必要です。
Dockerfile側
以下のようにENTRYPOINT
を指定します。
/sbin/init
を指定することでsystemdが起動します。
devcontainer.json側で"runArgs": ["--entrypoint", "/sbin/init"]
を指定しても同じかと思われるかもしれません。しかし、Devcontainerでコンテナを起動するときにdocker
コマンドの引数の最後に--entrypoint
が指定されて上書きされるため、runArgsでentrypoint
を指定しても意味がありません。そのため、ENTRYPOINT
で指定します。
systemdのパスが/sbin/init
出ない場合は別のパスを指定してください。
私はUbuntu 22.04の場合は/lib/systemd/systemd
から/sbin/init
にシンボリックリンクを張りました。
ENTRYPOINT ["/sbin/init"]
devcontainer.json側
何も指定しないとsystemdが起動しないので、以下のように指定します。
overrideCommandをfalseにしておくことで、DockerfileのENTRYPOINT
で指定したコマンドが実行されます。
privilegedをtrueにしておくことで、systemdが起動できるようになります。
"overrideCommand": false,
"privileged": true,
まとめ
Devcontainerでsystemdが動くコンテナを起動する方法を記しました。
systemdが動くコンテナを起動することで、systemdの設定を変更したり、systemdのサービスを追加したりすることができます。
あんまりDevcontainer(というかコンテナ)でsystemdを動かすのはバットプラクティスな感じがしますが、私のように必要な場合もあるかと思うので、参考にしていただければと思います。
Discussion