はじめに
先日、Docker Composeを利用したシステムの稼働中のコンテナを停止させようとした際、意図せずdown
を実行し、全てのコンテナを削除してしまいました。
その後、再びコンテナを起動しようと、これまで通りdocker-compose up -d
のコマンドを実行したところ、以下のエラーメッセージが、、、
zsh: command not found: docker-compose
自分のメモをコピペしてコマンドを実行したので、以前は確実に使えていたのになぜ、、
今回、このエラーに関する対処法と原因について調査した内容を残したいと思い、記事にしてみました。
簡単な対処法
手っ取り早い対処法ですが、docker-compose up -d
のコマンドを以下に変更して実行すると、一旦はうまく動作しました。
docker compose up -d
違いはdocker
とcompose
の間に-
があるかないかだけです。
ただ、これだと根本解決にはならないので、原因を詳しく調べてみました。
原因と対処法
dockerdocsに原因と対処法が載っていました。
After Docker Compose V1 was removed in Docker Desktop version 4.23.0 as it had reached end-of-life, the docker-compose command now points directly to the Docker Compose V2 binary, running in standalone mode. If you rely on Docker Desktop auto-update, the symlink might be broken and command unavailable, as the update doesn't ask for administrator password.
上記をまとめると
- Docker ComposeV1はサポート終了となり、Docker Desktop4.23.0以降は代わりにDocker ComposeV2が導入され、docker-composeコマンドは直接Docker ComposeV2のバイナリ(実行ファイル)を参照するようになった。
- Docker Desktopの自動アップデートを利用している場合、アップデート時に既存のシンボリックリンクが壊れてしまう可能性があり、docker-composeコマンドが利用できなくなる場合がある。
ということみたいです。
確かに、Docker Desktopのソフトウェアアップデートが来ていた場合、特に内容を調査することなくアップデートしてしまっていました、、
おそらくどこかのアップデートのタイミングで、自身の環境のシンボリックリンクが壊れてしまっていたようです。
親切に対処法も載っており、記載されている以下のコマンドをそのまま実行することで新しくシンボリックリンクが作成され、-
ありのdocker-compose
コマンドでも正しく認識されるようになります。
sudo rm /usr/local/bin/docker-compose
sudo ln -s /Applications/Docker.app/Contents/Resources/cli-plugins/docker-compose /usr/local/bin/docker-compose
実際にやってみる
❯ docker-compose version
zsh: command not found: docker-compose
❯ which docker
/usr/local/bin/docker
❯ ls -la /usr/local/bin/docker-compose
lrwxr-xr-x 1 root wheel 62 4 24 2023 /usr/local/bin/docker-compose -> /Applications/Docker.app/Contents/Resources/bin/docker-compose
❯ sudo rm /usr/local/bin/docker-compose
sudo ln -s /Applications/Docker.app/Contents/Resources/cli-plugins/docker-compose /usr/local/bin/docker-compose
Password:
❯ ls -la /usr/local/bin/docker-compose
lrwxr-xr-x 1 root wheel 70 2 24 14:33 /usr/local/bin/docker-compose -> /Applications/Docker.app/Contents/Resources/cli-plugins/docker-compose
❯ docker-compose version
Docker Compose version v2.31.0-desktop.2
無事、docker-compose version
で現在のバージョンを表示させることができるようになりました。
Docker Compose V1とV2について
今回のエラーに関連する部分について、それぞれについて少し調べてみました。
Docker Compose V1について
- Pythonスクリプトとして提供されていたもの。
- システムに個別にインストールされ、
docker-compose
コマンドにより、そのスクリプトが呼び出される仕組み。
Docker Compose V2について
- Docker CLIの拡張プラグインとしてGo言語を用いて実装されたもの。
-
docker-compose
コマンドは、実際にはDocker Desktopに含まれるDocker Compose V2のバイナリファイル(実行可能ファイル)を呼び出すシンボリックリンクとして動作する。
おわりに
普段何気なく使っているdocker-compose
関連の内部について学ぶ機会となりました。
今後は脳死でアップデートする危険性をしっかり頭に入れておきたいと思います。
参考
告知
最後にお知らせとなりますが、イーディーエーでは一緒に働くエンジニアを
募集しております。詳しくは採用情報ページをご確認ください。
みなさまからのご応募をお待ちしております。