🐳

Devcontainerでsystemdが動くコンテナを起動する

2024/05/16に公開

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にシンボリックリンクを張りました。

Dockerfile(一部)
ENTRYPOINT ["/sbin/init"]

devcontainer.json側

何も指定しないとsystemdが起動しないので、以下のように指定します。

overrideCommandをfalseにしておくことで、DockerfileのENTRYPOINTで指定したコマンドが実行されます。

privilegedをtrueにしておくことで、systemdが起動できるようになります。

devcontainer.json(一部)
  "overrideCommand": false,

  "privileged": true,

まとめ

Devcontainerでsystemdが動くコンテナを起動する方法を記しました。

systemdが動くコンテナを起動することで、systemdの設定を変更したり、systemdのサービスを追加したりすることができます。

あんまりDevcontainer(というかコンテナ)でsystemdを動かすのはバットプラクティスな感じがしますが、私のように必要な場合もあるかと思うので、参考にしていただければと思います。

GitHubで編集を提案

Discussion