🤔

M1 Mac環境が原因でAnsibleのdocker pullが失敗した件

2024/11/24に公開

問題の現象

Ansibleのplaybookのdocker pullを実行している箇所で以下のようなエラーが発生した。

TASK [prepare : Pull images] ************************************************
failed: [xxx] (item=xxx) => {
    "msg": "Error connecting: Error while fetching server API version: 
    ('Connection aborted.', FileNotFoundError(2, 'No such file or directory'))"
}

私の環境:

  • M1 Mac環境で発生
  • docker desktopを使用
  • Ansibleを使わず、zshで対象のイメージをdocker pullすることは出来た

原因

問題の原因は、以下のパスについての相違にあったようです。

  • MacでDocker Desktopをインストールした際に作成されるソケットファイル(docker.sock)のディレクトリが~/.docker/run/docker.sockになっている。
  • 一方、Ansibleの背後で動作するdocker-pyは、デフォルトでソケットファイルが/var/run/docker.sockにある前提で動作する。
    • やや詳しく書くと、ソケットファイルが環境変数DOCKER_HOSTのパスにあるという前提で動作する。DOCKER_HOSTの値が設定されていないときのデフォルト値が/var/run/docker.sockであった。

解決方法

シンボリックリンクを作成して、Ansibleが期待するパスで実際のソケットファイルにアクセスできるようにしたところ、解決しました。

# シンボリックリンクを作成
sudo ln -s ~/.docker/run/docker.sock /var/run/docker.sock

他の解決方法

環境変数DOCKER_HOSTを指定しておく方法でも解決できるようでした。

export DOCKER_HOST="unix://${HOME}/.docker/run/docker.sock"

Discussion