Dockerを23にアップグレードしたら-g(--graph)オプションが廃止されてdockerdが起動できなくなっていた

Posted by 雅楽斎 on Thursday, February 16, 2023

TOC

概要

  • Ubuntu 22.04で運用しているRaspberry Pi 4をいつも通りaptで更新したらdockerのメジャーアップデートが含まれていた
  • Dockerの20→23のアップデートでdockerdの引数に指定する-g/--graphが廃止されて、--data-rootに置き換える必要があった
  • Ubuntuでdockerを使っていた人はそれなりにハマっている模様

現象

ログの確認

Dockerコンテナ(docker-composeによる自動起動)が上がってこなくなったので、syslogを確認。

 769770 Feb 14 16:35:34 rpi4 systemd[1397]: Started Docker Application Container Engine (Rootless).
 769771 Feb 14 16:35:34 rpi4 dockerd-rootless.sh[2071]: + [ -w /run/user/1001 ]
 769772 Feb 14 16:35:34 rpi4 dockerd-rootless.sh[2071]: + [ -d /home/hogehoge ]
 769773 Feb 14 16:35:34 rpi4 dockerd-rootless.sh[2071]: + rootlesskit=
 769774 Feb 14 16:35:34 rpi4 dockerd-rootless.sh[2071]: + command -v docker-rootlesskit
 769775 Feb 14 16:35:34 rpi4 dockerd-rootless.sh[2071]: + command -v rootlesskit
 769776 Feb 14 16:35:34 rpi4 dockerd-rootless.sh[2071]: + rootlesskit=rootlesskit
 769777 Feb 14 16:35:34 rpi4 dockerd-rootless.sh[2071]: + break
 769778 Feb 14 16:35:34 rpi4 dockerd-rootless.sh[2071]: + [ -z rootlesskit ]
 769779 Feb 14 16:35:34 rpi4 dockerd-rootless.sh[2071]: + :
 769780 Feb 14 16:35:34 rpi4 dockerd-rootless.sh[2071]: + :
 769781 Feb 14 16:35:34 rpi4 dockerd-rootless.sh[2071]: + : builtin
 769782 Feb 14 16:35:34 rpi4 dockerd-rootless.sh[2071]: + : auto
 769783 Feb 14 16:35:34 rpi4 dockerd-rootless.sh[2071]: + : auto
 769784 Feb 14 16:35:34 rpi4 dockerd-rootless.sh[2071]: + net=
 769785 Feb 14 16:35:34 rpi4 dockerd-rootless.sh[2071]: + mtu=
 769786 Feb 14 16:35:34 rpi4 dockerd-rootless.sh[2071]: + [ -z  ]
 769787 Feb 14 16:35:34 rpi4 dockerd-rootless.sh[2071]: + command -v slirp4netns
 769788 Feb 14 16:35:34 rpi4 dockerd-rootless.sh[2072]: + slirp4netns --help
 769789 Feb 14 16:35:34 rpi4 dockerd-rootless.sh[2073]: + grep -qw -- --netns-type
 769790 Feb 14 16:35:34 rpi4 dockerd-rootless.sh[2071]: + net=slirp4netns
 769791 Feb 14 16:35:34 rpi4 dockerd-rootless.sh[2071]: + [ -z  ]
 769792 Feb 14 16:35:34 rpi4 dockerd-rootless.sh[2071]: + mtu=65520
 769793 Feb 14 16:35:34 rpi4 dockerd-rootless.sh[2071]: + [ -z slirp4netns ]
 769794 Feb 14 16:35:34 rpi4 dockerd-rootless.sh[2071]: + [ -z 65520 ]
 769795 Feb 14 16:35:34 rpi4 dockerd-rootless.sh[2071]: + dockerd=dockerd
 769796 Feb 14 16:35:34 rpi4 dockerd-rootless.sh[2071]: + [ -z  ]
 769797 Feb 14 16:35:34 rpi4 dockerd-rootless.sh[2071]: + _DOCKERD_ROOTLESS_CHILD=1
 769798 Feb 14 16:35:34 rpi4 dockerd-rootless.sh[2071]: + export _DOCKERD_ROOTLESS_CHILD
 769799 Feb 14 16:35:34 rpi4 dockerd-rootless.sh[2074]: + id -u
 769800 Feb 14 16:35:34 rpi4 dockerd-rootless.sh[2071]: + [ 1001 = 0 ]
 769801 Feb 14 16:35:34 rpi4 dockerd-rootless.sh[2071]: + command -v selinuxenabled
 769802 Feb 14 16:35:34 rpi4 dockerd-rootless.sh[2071]: + exec rootlesskit --net=slirp4netns --mtu=65520 --slirp4netns-sandbox=auto --slirp4netns-seccomp=auto --disa        ble-host-loopback --port-driver=builtin --copy-up=/etc --copy-up=/run --propagation=rslave /usr/bin/dockerd-rootless.sh -g /mnt/usbhdd1/var/docker-image-rootless --storage-driver=overlay2
 769804 Feb 14 16:35:35 rpi4 dockerd-rootless.sh[2108]: + [ -w /run/user/1001 ]
 769805 Feb 14 16:35:35 rpi4 dockerd-rootless.sh[2108]: + [ -d /home/hogehoge ]
 769806 Feb 14 16:35:35 rpi4 dockerd-rootless.sh[2108]: + rootlesskit=
 769807 Feb 14 16:35:35 rpi4 dockerd-rootless.sh[2108]: + command -v docker-rootlesskit
 769808 Feb 14 16:35:35 rpi4 dockerd-rootless.sh[2108]: + command -v rootlesskit
 769809 Feb 14 16:35:35 rpi4 dockerd-rootless.sh[2108]: + rootlesskit=rootlesskit
 769810 Feb 14 16:35:35 rpi4 dockerd-rootless.sh[2108]: + break
 769811 Feb 14 16:35:35 rpi4 dockerd-rootless.sh[2108]: + [ -z rootlesskit ]
 769812 Feb 14 16:35:35 rpi4 dockerd-rootless.sh[2108]: + :
 769813 Feb 14 16:35:35 rpi4 dockerd-rootless.sh[2108]: + :
 769814 Feb 14 16:35:35 rpi4 dockerd-rootless.sh[2108]: + : builtin
 769815 Feb 14 16:35:35 rpi4 dockerd-rootless.sh[2108]: + : auto
 769816 Feb 14 16:35:35 rpi4 dockerd-rootless.sh[2108]: + : auto
 769817 Feb 14 16:35:35 rpi4 dockerd-rootless.sh[2108]: + net=
 769818 Feb 14 16:35:35 rpi4 dockerd-rootless.sh[2108]: + mtu=
 769819 Feb 14 16:35:35 rpi4 dockerd-rootless.sh[2108]: + [ -z  ]
 769820 Feb 14 16:35:35 rpi4 dockerd-rootless.sh[2108]: + command -v slirp4netns
 769821 Feb 14 16:35:35 rpi4 dockerd-rootless.sh[2112]: +
 769822 Feb 14 16:35:35 rpi4 dockerd-rootless.sh[2114]: +
 769823 Feb 14 16:35:35 rpi4 dockerd-rootless.sh[2112]: slirp4netns
 769824 Feb 14 16:35:35 rpi4 dockerd-rootless.sh[2114]: grep
 769825 Feb 14 16:35:35 rpi4 dockerd-rootless.sh[2112]:  --help
 769826 Feb 14 16:35:35 rpi4 dockerd-rootless.sh[2114]:  -qw
 769827 Feb 14 16:35:35 rpi4 dockerd-rootless.sh[2114]:  -- --netns-type
 769828 Feb 14 16:35:35 rpi4 dockerd-rootless.sh[2108]: + net=slirp4netns
 769829 Feb 14 16:35:35 rpi4 dockerd-rootless.sh[2108]: + [ -z  ]
 769830 Feb 14 16:35:35 rpi4 dockerd-rootless.sh[2108]: + mtu=65520
 769831 Feb 14 16:35:35 rpi4 dockerd-rootless.sh[2108]: + [ -z slirp4netns ]
 769832 Feb 14 16:35:35 rpi4 dockerd-rootless.sh[2108]: + [ -z 65520 ]
 769833 Feb 14 16:35:35 rpi4 dockerd-rootless.sh[2108]: + dockerd=dockerd
 769834 Feb 14 16:35:35 rpi4 dockerd-rootless.sh[2108]: + [ -z 1 ]
 769835 Feb 14 16:35:35 rpi4 dockerd-rootless.sh[2108]: + [ 1 = 1 ]
 769836 Feb 14 16:35:35 rpi4 dockerd-rootless.sh[2108]: + rm -f /run/docker /run/containerd /run/xtables.lock
 769837 Feb 14 16:35:35 rpi4 dockerd-rootless.sh[2108]: + [ -n  ]
 769838 Feb 14 16:35:35 rpi4 dockerd-rootless.sh[2116]: + stat -c %T -f /etc
 769839 Feb 14 16:35:35 rpi4 dockerd-rootless.sh[2108]: + [ tmpfs = tmpfs ]
 769840 Feb 14 16:35:35 rpi4 dockerd-rootless.sh[2108]: + [ -L /etc/ssl ]
 769841 Feb 14 16:35:35 rpi4 dockerd-rootless.sh[2117]: + realpath /etc/ssl
 769842 Feb 14 16:35:35 rpi4 dockerd-rootless.sh[2108]: + realpath_etc_ssl=/etc/.ro2693256246/ssl
 769843 Feb 14 16:35:35 rpi4 dockerd-rootless.sh[2108]: + rm -f /etc/ssl
 769844 Feb 14 16:35:35 rpi4 dockerd-rootless.sh[2108]: + mkdir /etc/ssl
 769845 Feb 14 16:35:35 rpi4 dockerd-rootless.sh[2108]: + mount --rbind /etc/.ro2693256246/ssl /etc/ssl
 769846 Feb 14 16:35:35 rpi4 dockerd-rootless.sh[2108]: + exec dockerd -g /mnt/usbhdd1/var/docker-image-rootless --storage-driver=overlay2
 769849 Feb 14 16:35:35 rpi4 dockerd-rootless.sh[2108]: Flag --graph has been deprecated, Use --data-root instead
 769850 Feb 14 16:35:35 rpi4 dockerd-rootless.sh[2108]: the "graph" config file option is deprecated; use "data-root" instead
 769852 Feb 14 16:35:35 rpi4 dockerd-rootless.sh[2082]: [rootlesskit:child ] error: command [/usr/bin/dockerd-rootless.sh -g /mnt/usbhdd1/var/docker-image-rootless -        -storage-driver=overlay2] exited: exit status 1
 769853 Feb 14 16:35:35 rpi4 dockerd-rootless.sh[2071]: [rootlesskit:parent] error: child exited: exit status 1
 769854 Feb 14 16:35:35 rpi4 systemd[1397]: docker.service: Main process exited, code=exited, status=1/FAILURE
 769855 Feb 14 16:35:35 rpi4 systemd[1397]: docker.service: Failed with result 'exit-code'.
 769856 Feb 14 16:35:35 rpi4 systemd[1397]: docker.service: Consumed 1.509s CPU time.

応急処置

同じ事象に引っかかっているという方は応急処置をする必要はありません。読み飛ばして下さい。

最近aptで更新した時にdocker-ceが更新された記憶があったので、パッケージの履歴を確認。

$ apt-cache policy docker-ce
docker-ce:
  インストールされているバージョン: 5:23.0.1-1~ubuntu.22.04~jammy
  候補:               5:23.0.1-1~ubuntu.22.04~jammy
  バージョンテーブル:
 *** 5:23.0.1-1~ubuntu.22.04~jammy 500
        500 http://download.docker.com/linux/ubuntu jammy/stable arm64 Packages
     5:23.0.0-1~ubuntu.22.04~jammy 500
        500 http://download.docker.com/linux/ubuntu jammy/stable arm64 Packages
     5:20.10.23~3-0~ubuntu-jammy 500
        500 http://download.docker.com/linux/ubuntu jammy/stable arm64 Packages
        100 /var/lib/dpkg/status
     5:20.10.22~3-0~ubuntu-jammy 500
        500 http://download.docker.com/linux/ubuntu jammy/stable arm64 Packages
     5:20.10.21~3-0~ubuntu-jammy 500
        500 http://download.docker.com/linux/ubuntu jammy/stable arm64 Packages
     5:20.10.20~3-0~ubuntu-jammy 500
        500 http://download.docker.com/linux/ubuntu jammy/stable arm64 Packages
     5:20.10.19~3-0~ubuntu-jammy 500
        500 http://download.docker.com/linux/ubuntu jammy/stable arm64 Packages
     5:20.10.18~3-0~ubuntu-jammy 500
        500 http://download.docker.com/linux/ubuntu jammy/stable arm64 Packages
     5:20.10.17~3-0~ubuntu-jammy 500
        500 http://download.docker.com/linux/ubuntu jammy/stable arm64 Packages
     5:20.10.16~3-0~ubuntu-jammy 500
        500 http://download.docker.com/linux/ubuntu jammy/stable arm64 Packages
     5:20.10.15~3-0~ubuntu-jammy 500
        500 http://download.docker.com/linux/ubuntu jammy/stable arm64 Packages
     5:20.10.14~3-0~ubuntu-jammy 500
        500 http://download.docker.com/linux/ubuntu jammy/stable arm64 Packages
     5:20.10.13~3-0~ubuntu-jammy 500
        500 http://download.docker.com/linux/ubuntu jammy/stable arm64 Packages

メジャーバージョンが20から23に上がっていたので、とりあえず23になる前の最新のパッケージに更新。

# apt-get install docker-ce=5:20.10.23~3-0~ubuntu-jammy
$ apt-cache policy docker-ce
docker-ce:
  インストールされているバージョン: 5:20.10.23~3-0~ubuntu-jammy
  候補:               5:23.0.1-1~ubuntu.22.04~jammy
  バージョンテーブル:
     5:23.0.1-1~ubuntu.22.04~jammy 500
        500 http://download.docker.com/linux/ubuntu jammy/stable arm64 Packages
     5:23.0.0-1~ubuntu.22.04~jammy 500
        500 http://download.docker.com/linux/ubuntu jammy/stable arm64 Packages
 *** 5:20.10.23~3-0~ubuntu-jammy 500
        500 http://download.docker.com/linux/ubuntu jammy/stable arm64 Packages
        100 /var/lib/dpkg/status
     5:20.10.22~3-0~ubuntu-jammy 500
        500 http://download.docker.com/linux/ubuntu jammy/stable arm64 Packages
     5:20.10.21~3-0~ubuntu-jammy 500
        500 http://download.docker.com/linux/ubuntu jammy/stable arm64 Packages
     5:20.10.20~3-0~ubuntu-jammy 500
        500 http://download.docker.com/linux/ubuntu jammy/stable arm64 Packages
     5:20.10.19~3-0~ubuntu-jammy 500
        500 http://download.docker.com/linux/ubuntu jammy/stable arm64 Packages
     5:20.10.18~3-0~ubuntu-jammy 500
        500 http://download.docker.com/linux/ubuntu jammy/stable arm64 Packages
     5:20.10.17~3-0~ubuntu-jammy 500
        500 http://download.docker.com/linux/ubuntu jammy/stable arm64 Packages
     5:20.10.16~3-0~ubuntu-jammy 500
        500 http://download.docker.com/linux/ubuntu jammy/stable arm64 Packages
     5:20.10.15~3-0~ubuntu-jammy 500
        500 http://download.docker.com/linux/ubuntu jammy/stable arm64 Packages
     5:20.10.14~3-0~ubuntu-jammy 500
        500 http://download.docker.com/linux/ubuntu jammy/stable arm64 Packages
     5:20.10.13~3-0~ubuntu-jammy 500
        500 http://download.docker.com/linux/ubuntu jammy/stable arm64 Packages

OS再起動でdocker-composeのコンテナが上がってくることを確認して諸々の確認作業に。

Docker Engine 23.0 release notes | Docker Documentation

Docker23のリリースノートに該当しそうな記述を発見。

syslogのエラーを今一度確認してみる。

 769846 Feb 14 16:35:35 rpi4 dockerd-rootless.sh[2108]: + exec dockerd -g /mnt/usbhdd1/var/docker-image-rootless --storage-driver=overlay2
 769849 Feb 14 16:35:35 rpi4 dockerd-rootless.sh[2108]: Flag --graph has been deprecated, Use --data-root instead
 769850 Feb 14 16:35:35 rpi4 dockerd-rootless.sh[2108]: the "graph" config file option is deprecated; use "data-root" instead

graphはdeprecatedだからdata-rootに変える旨のエラーログ。graphなんか使ってたっけなと思って諸々確認した結果、短縮形は-gでdockerdを呼び出す時に指定していましたというオチ。

コミュニティの反応

Dockerコミュニティにもそれなりの量の報告がされている。

対処法

3つ目の中で

Just to inform you, I had the ‘same’ problem (I mean, not working Docker after the 23.0 upgrade), but because the depriciated graph definition in the daemon.json.

After changed that to data-root, my problem have solved.

というレスポンスがあり、一般的にはdaemon.jsonというファイルで指定しているそうである(私の場合は該当しなかったが)

daemon.jsonなるファイルは、ubuntu - Where’s docker’s daemon.json? (missing) - Stack Overflow によると

  • /etc/docker/daemon.json
  • dockerd –config-file /etc/docker/daemon.json としてdockerdコマンドの実行時に–config-fileオプションで指定

のどちらかとのことなので、さっくり確認。

# ls -la /etc/docker/
合計 20
drwxr-xr-x   2 root root  4096  1月 25  2021 .
drwxr-xr-x 158 root root 12288  2月 14 07:00 ..
-rw-------   1 root root   244  1月 25  2021 key.json

前者ではありませんでした。

うちの場合はRootless dockerを使っているので、dockerの起動は~/.config/systemd/user/docker.serviceに記載している。

Dockerをrootlessに変更してrootユーザーの呪縛から開放される

$ grep ExecStart ~/.config/systemd/user/docker.service
ExecStart=/usr/bin/dockerd-rootless.sh -g /mnt/usbhdd1/var/docker-image-rootless --storage-driver=overlay2

この-g--graphの短縮形なので、これを--data-rootに変える

$ diff -u ~/.config/systemd/user/docker.service{.org,}
--- /home/hogehoge/.config/systemd/user/docker.service.org      2022-04-21 00:01:06.772710527 +0900
+++ /home/hogehoge/.config/systemd/user/docker.service  2023-02-16 00:56:20.496870673 +0900
@@ -5,7 +5,7 @@

 [Service]
 Environment=PATH=/usr/bin:/sbin:/usr/sbin:/home/hogehoge/bin:/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin:/usr/games:/usr/local/games:/snap/bin
-ExecStart=/usr/bin/dockerd-rootless.sh -g /mnt/usbhdd1/var/docker-image-rootless --storage-driver=overlay2
+ExecStart=/usr/bin/dockerd-rootless.sh --data-root /mnt/usbhdd1/var/docker-image-rootless --storage-driver=overlay2
 ExecReload=/bin/kill -s HUP $MAINPID
 TimeoutSec=0
 RestartSec=2

systemdでリロード。

$ systemctl --user daemon-reload 
$ systemctl --user restart docker

Dockerサービスとコンテナが再起動されることを確認。

docker-ceパッケージを戻して確認

上述した応急処置でdocker-ceパッケージを20に戻した場合は、もう一度docker23に戻す。

# apt-cache policy docker-ce
docker-ce:
  インストールされているバージョン: 5:20.10.23~3-0~ubuntu-jammy
  候補:               5:23.0.1-1~ubuntu.22.04~jammy
  バージョンテーブル:
     5:23.0.1-1~ubuntu.22.04~jammy 500
        500 http://download.docker.com/linux/ubuntu jammy/stable arm64 Packages
     5:23.0.0-1~ubuntu.22.04~jammy 500
        500 http://download.docker.com/linux/ubuntu jammy/stable arm64 Packages
 *** 5:20.10.23~3-0~ubuntu-jammy 500
        500 http://download.docker.com/linux/ubuntu jammy/stable arm64 Packages
        100 /var/lib/dpkg/status
     5:20.10.22~3-0~ubuntu-jammy 500
        500 http://download.docker.com/linux/ubuntu jammy/stable arm64 Packages
     5:20.10.21~3-0~ubuntu-jammy 500
        500 http://download.docker.com/linux/ubuntu jammy/stable arm64 Packages
     5:20.10.20~3-0~ubuntu-jammy 500
        500 http://download.docker.com/linux/ubuntu jammy/stable arm64 Packages
     5:20.10.19~3-0~ubuntu-jammy 500
        500 http://download.docker.com/linux/ubuntu jammy/stable arm64 Packages
     5:20.10.18~3-0~ubuntu-jammy 500
        500 http://download.docker.com/linux/ubuntu jammy/stable arm64 Packages
     5:20.10.17~3-0~ubuntu-jammy 500
        500 http://download.docker.com/linux/ubuntu jammy/stable arm64 Packages
     5:20.10.16~3-0~ubuntu-jammy 500
        500 http://download.docker.com/linux/ubuntu jammy/stable arm64 Packages
     5:20.10.15~3-0~ubuntu-jammy 500
        500 http://download.docker.com/linux/ubuntu jammy/stable arm64 Packages
     5:20.10.14~3-0~ubuntu-jammy 500
        500 http://download.docker.com/linux/ubuntu jammy/stable arm64 Packages
     5:20.10.13~3-0~ubuntu-jammy 500
        500 http://download.docker.com/linux/ubuntu jammy/stable arm64 Packages
# apt-get install docker-ce=5:23.0.1-1~ubuntu.22.04~jammy

dockerは自動的に再起動されると思うので、あとはOSの再起動をしてdocker-composeでコンテナが自動起動することを確認して対応終了。

余談

実は今回対応に少し時間がかかっていて、syslogに出ている「graphオプションがdeprecatedだからdata-rootに変更」でgraphオプションを書いた記憶が全くなく、短縮形のgで引っかかっていることになかなか気付きませんでした。

また、弊blog内の以下の記事を同時に修正しています。

Dockerをrootlessに変更してrootユーザーの呪縛から開放される

なんかDockerの調子が悪い→Dockerのバージョンアップで適用されるストレージドライバーが変わっていたため

スポンサーリンク


comments powered by Disqus