🤔
M1 Mac環境が原因でAnsibleのdocker pullが失敗した件
問題の現象
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