Works by

Ren's blog

@rennnosuke_rk 技術ブログです

MacOS で Rancher Desktop(moby)を使用する場合に発生するdockerコマンドのtimeoutを回避する

Env

Background

MacOS に Rancher Desktop をインストールして docker pulldocker login などレジストリへのネットワーク転送が発生する処理を実行した時、timeoutエラーが発生して処理が失敗しまいました。

例えば docker run を実行すると、以下のように既定レジストリへのリクエストがtimeoutによってキャンセルされてしまいます。

$ sudo docker run --name=mysql-ops-manage --restart on-failure -d mysql/mysql-server:8.0

Unable to find image 'mysql/mysql-server:8.0' locally
docker: Error response from daemon: Get "https://registry-1.docker.io/v2/": net/http: request canceled (Client.Timeout exceeded while awaiting headers).
See 'docker run --help'.

環境はwindowsですが、下記issueで同様の事象が報告されていました。

github.com

また、関連するMacのissueとして下記も起票されていました。

github.com

How

こちらのGistを参考にします。

gist.github.com

Rancher Desktop on MacOSで実行されているlima-vm上で名前解決が失敗しているのが今回の事象の原因のようでした。 ドキュメントではApple Silicon上で再現したようですが、VM上の名前解決の話なのでx86_64でも同様に再現したと思われます。

上記ドキュメントで示されている通り、VM中の /etc/resolv.confDNSサーバーIPをGoogle Public DNSに変更します。

$ LIMA_HOME="$HOME/Library/Application Support/rancher-desktop/lima" "/Applications/Rancher Desktop.app/Contents/Resources/resources/darwin/lima/bin/limactl" shell 0

$ sudo chown $(whoami) /etc/resolv.conf

$ sudo sed -i 's/nameserver.*/nameserver 8.8.8.8/g' /etc/resolv.conf

$ exit

修正後Rancher Desktopを再起動すると、冒頭の docker run で正常にレジストリからのimage pullに成功しました。

$ docker run --name=mysql-ops-manage --restart on-failure -d mysql/mysql-server:8.0

Unable to find image 'mysql/mysql-server:8.0' locally
8.0: Pulling from mysql/mysql-server
6a4a3ef82cdc: Pull complete 
5518b09b1089: Pull complete 
b6b576315b62: Pull complete 
349b52643cc3: Pull complete 
abe8d2406c31: Pull complete 
c7668948e14a: Pull complete 
c7e93886e496: Pull complete 
Digest: sha256:d6c8301b7834c5b9c2b733b10b7e630f441af7bc917c74dba379f24eeeb6a313
Status: Downloaded newer image for mysql/mysql-server:8.0
ff10819f6715474c0c5bcec99432e813ea7222850e03e475f5760432c31ed497

Remarks

~/Library/Application\ Support/rancher-desktop/lima/_config/override.yamlDNSサーバーを直接指定することでも解決できるようです。

github.com

試しにcontainer/imageを削除し、Rancher Desktopを再度インストールします。

すると初期状態に戻り、 冒頭の docker run は失敗します。 (初回とは異なるエラー文言となってしまいましたが...内容から名前解決による失敗は同様のようです)

$ sudo docker run --name=mysql-ops-manage --restart on-failure -d mysql/mysql-server:8.0
Unable to find image 'mysql/mysql-server:8.0' locally
docker: Error response from daemon: Get "https://registry-1.docker.io/v2/": dial tcp: lookup registry-1.docker.io on 192.168.5.3:53: read udp 192.168.5.15:50831->192.168.5.3:53: i/o timeout.
See 'docker run --help'.

~/Library/Application\ Support/rancher-desktop/lima/_config/override.yaml を作成します。

$ cat << EOF > ~/Library/Application\ Support/rancher-desktop/lima/_config/override.yaml
heredoc> hostResolver:
  enabled: false
dns:
- 8.8.8.8
heredoc> EOF

修正後Rancher Desktopを再起動すると、冒頭の docker run で正常にレジストリからのimage pullに成功しました。

$ sudo docker run --name=mysql-ops-manage --restart on-failure -d mysql/mysql-server:8.0
Password:
Unable to find image 'mysql/mysql-server:8.0' locally
8.0: Pulling from mysql/mysql-server
6a4a3ef82cdc: Pull complete 
5518b09b1089: Pull complete 
b6b576315b62: Pull complete 
349b52643cc3: Pull complete 
abe8d2406c31: Pull complete 
c7668948e14a: Pull complete 
c7e93886e496: Pull complete 
Digest: sha256:d6c8301b7834c5b9c2b733b10b7e630f441af7bc917c74dba379f24eeeb6a313
Status: Downloaded newer image for mysql/mysql-server:8.0
09a32632bc98e501119e0fc09708e5f7cddb0c8e7f0ec215d33f867271dbfba3

Appendix