[目次]
環境
Host: mac m1 Docker: v24.0.6 Docker context: Docker Desktop AWS CLI: aws-cli/2.13.25 Python/3.11.6 Darwin/22.1.0 source/arm64 prompt/off
まとめ
エラー内容
$ aws lightsail push-container-image --region ap-northeast-1 --service-name Amazon_Linux_2-1 --service-name container-service-1 --label testlabel --image web-backend:ee0e066df842 Cannot connect to the Docker daemon at unix:///var/run/docker.sock. Is the docker daemon running? Command '['lightsailctl', '--plugin', '--input-stdin']' returned non-zero exit status 1.
原因
Docker context の指す endpoint がデフォルト値(unix:///var/run/docker.sock
)と異なること。
$ docker context ls
NAME TYPE DESCRIPTION DOCKER ENDPOINT KUBERNETES ENDPOINT ORCHESTRATOR
default moby Current DOCKER_HOST based configuration unix:///var/run/docker.sock
desktop-linux * moby Docker Desktop unix:///Users/kokoichi/.docker/run/docker.sock
解決方法
コマンド実行時に HOST を明示して上書きしてあげる。
$ DOCKER_HOST=unix:///Users/kokoichi/.docker/run/docker.sock aws lightsail push-container-image --region ap-northeast-1 --service-name Amazon_Linux_2-1 --service-name container-service-1 --label testlabel --image sns-app-backend:ee0e066df842
背景
Lightsail に cli からアップロードするためにプラグインをインストールして使っていました。
brew install aws/tap/lightsailctl
ドキュメントに沿って進めていたのですが、push するタイミングで 『Cannot connect to the Docker daemon at unix:///var/run/docker.sock. Is the docker daemon running?』のようなエラーが出ました。
$ aws lightsail push-container-image --region ap-northeast-1 --service-name Amazon_Linux_2-1 --service-name container-service-1 --label testlabel --image web-backend:ee0e066df842 Cannot connect to the Docker daemon at unix:///var/run/docker.sock. Is the docker daemon running? Command '['lightsailctl', '--plugin', '--input-stdin']' returned non-zero exit status 1.
そこで Docker の context を見ると、現在(Docker Desktop によって)使用中の ENDPOINT がエラー文に記載のものと異なっていました。
$ docker context ls
NAME TYPE DESCRIPTION DOCKER ENDPOINT KUBERNETES ENDPOINT ORCHESTRATOR
default moby Current DOCKER_HOST based configuration unix:///var/run/docker.sock
desktop-linux * moby Docker Desktop unix:///Users/kokoichi/.docker/run/docker.sock
aws-cli や lightsailctl には関連 issue はなさそうだったため、lightsail の cli 側で docker をどのように参照してるのかみてみます。
pushContainer の中で DockerEngine を作成していて、 ここの client.Fromenv とはこれのことで、DOCKER_API_VERSION や DOCKER_HOST が環境変数により設定できそうなことが分かりました。
そこで、以下のようにシェル変数を使って DOCKER の HOST 情報を更新してあげたらうまくいきました。
$ DOCKER_HOST=unix:///Users/kokoichi/.docker/run/docker.sock aws lightsail push-container-image --region ap-northeast-1 --service-name Amazon_Linux_2-1 --service-name container-service-1 --label testlabel --image sns-app-backend:ee0e066df842 8968b52d5591: Pushed a83c9b56bbe0: Pushed 77192cf194dd: Pushed Digest: sha256:9136b6f88b47379a32a8388a742e41b5d0c26a7f8c3add7ff47653d48cb77a88 Image "sns-app-backend:ee0e066df842" registered. Refer to this image as ":container-service-1.testlabel.1" in deployments.
おわりに
環境変数を参照するロジックが本家の docker repository の client パッケージにあったため、多くの cli で応用が効きそうだと思いました。
ただ、docker context コマンドで出てくる情報くらいは、CLI 側で勝手に読み取って設定してほしさがあるので、どうにかできないか CLI 側をのぞいてみようと思います。