はじめに
EC2インスタンスでDockerをルートレスモードで実行させようとしたところ、systemdでの制御が出来ない状況に陥り、思いの外ハマってしまったので書き残しておきます。
- OS: Ubuntu 22.04.3 LTS
- 作業環境: EC2で構築し、SSMセッションマネージャでコンソールログインしての作業
何が起こった?
公式ドキュメントに従い、dockerをインストールし、ルートレスモードにしようと試みたところで躓きました。
dockerd-rootless-setuptool.sh
を実行したところ、ドキュメントと異なる出力となり、systemdでの起動設定が出来ない状況に陥りました。
下記が実行時の出力です。
ここではrunner
という非ルートユーザーで制御する事を目標としています。
$ whoami
runner
$ /usr/bin/dockerd-rootless-setuptool.sh install
[INFO] systemd not detected, dockerd-rootless.sh needs to be started manually:
PATH=/usr/bin:/sbin:/usr/sbin:$PATH dockerd-rootless.sh
[INFO] Creating CLI context "rootless"
Successfully created context "rootless"
[INFO] Using CLI context "rootless"
Current context is now "rootless"
[INFO] Make sure the following environment variable(s) are set (or add them to ~/.bashrc):
# WARNING: systemd not found. You have to remove XDG_RUNTIME_DIR manually on every logout.
export XDG_RUNTIME_DIR=/home/runner/.docker/run
export PATH=/usr/bin:$PATH
[INFO] Some applications may require the following environment variable too:
export DOCKER_HOST=unix:///home/runner/.docker/run/docker.sock
XDG_RUNTIME_DIR
環境変数等を設定しsystemdでの制御を試みるもエラーとなり実行できません。
$ export XDG_RUNTIME_DIR=/home/runner/.docker/run
$ export PATH=/usr/bin:$PATH
$ systemctl --user start docker.service
Failed to connect to bus: No such file or directory
どうしたのか
次のように対処しました。
-
machinctl
コマンドでrunnerユーザーにスイッチ - 再インストール
SSMでログインし、ssm-user →(sudo su -
)→ root →(su - runner
)→ runner とユーザーを切り替え作業したのですが、これが良くなかったようです。
rootからrunnerへの切り替えをmachinctl
で行う事で解消しました。
$ apt install systemd-container
Reading package lists... Done
...
$ machinectl shell runner@
Connected to the local host. Press ^] three times within 1s to exit session.
$ /usr/bin/dockerd-rootless-setuptool.sh uninstall
+ systemctl --user stop docker.service
...
$ /usr/bin/dockerd-rootless-setuptool.sh install
[INFO] Creating /home/runner/.config/systemd/user/docker.service
[INFO] starting systemd service docker.service
+ systemctl --user start docker.service
...
[INFO] Installed docker.service successfully.
[INFO] To control docker.service, run: `systemctl --user (start|stop|restart) docker.service`
[INFO] To run docker.service on system startup, run: `sudo loginctl enable-linger runner`
[INFO] Creating CLI context "rootless"
Successfully created context "rootless"
[INFO] Using CLI context "rootless"
Current context is now "rootless"
[INFO] Make sure the following environment variable(s) are set (or add them to ~/.bashrc):
export PATH=/usr/bin:$PATH
[INFO] Some applications may require the following environment variable too:
export DOCKER_HOST=unix:///run/user/1002/docker.sock
インストール時の出力がドキュメント相当となり、無事systemdでの制御が可能となりました。
原因は?
詳しく調査出来ていないのですが、Dockerのトラブルシュートに次の記載がありました。
you need to log in using pam_systemd.
今回は、AWSのマネコンからセッションマネージャを使用してログインしていたのですが、この方法だとpam_systemd
を使用していないので上手くいかなかった。と推測しています。
おそらく、sshログインをし直す方法等でも解消が見込めると思います。