Open2

MacのDocker DesktopでVSCodeのRemote Containerに接続できなくなった場合の対処法メモ

Makoto IshidaMakoto Ishida

現象

いつも通り docker compose up でコンテナを起動したあと、VSCodeのRemote Containerで接続しようとしたら、

Cannot connect to the Docker daemon at unix:///var/run/docker.sock

というエラーで接続できなかった。

原因

https://stackoverflow.com/questions/44084846/cannot-connect-to-the-docker-daemon-on-macos

it's because Docker got rid of the /var/run/docker.sock symlink in default behavior

とのこと。

対応策

下のコマンドを実行。

sudo ln -s ~/Library/Containers/com.docker.docker/Data/docker.raw.sock /var/run/docker.sock

参照元は下のページの「Permanent Solution: Manually Symlink」の箇所。
https://stackoverflow.com/questions/44084846/cannot-connect-to-the-docker-daemon-on-macos

Makoto IshidaMakoto Ishida

どうもMacを再起動するたびに上のln -sコマンドを実行しないとダメみたいなので、.zshrcに追記しておいた。

if [ ! -S /var/run/docker.sock ]; then
  sudo ln -s ~/Library/Containers/com.docker.docker/Data/docker.raw.sock /var/run/docker.sock
fi

メモ: -e と -S の違い
if [ ! -e ... ] と if [ ! -S ... ] は、どちらもBashスクリプトでファイルやディレクトリの存在を確認するための条件式ですが、チェックする内容が異なります。
if [ ! -e ... ]: この条件式は、指定したファイルやディレクトリが存在しない場合に真となります。-e は「存在するかどうか」を確認するためのオプションです。
if [ ! -S ... ]: この条件式は、指定したファイルが存在しないか、またはソケットファイルでない場合に真となります。-S は「ソケットファイルであるかどうか」を確認するためのオプションです。つまり、-e は一般的な存在確認に使われ、-S は特にソケットファイルであるかどうかを確認するために使われます。