はじめに
Docker Compose を使って開発環境を構築していると、コンテナに入ってコマンドを実行したくなる場面がよくあります。
しかし、実際に docker compose exec
を使おうとすると、意外とさまざまなエラーに遭遇することがあります。
この記事では、私が遭遇したエラーとその対処法をまとめます。
書こうと思ったきっかけ
ハッカソンで Next.js アプリケーションの開発を進める中、Makefile を使って簡単にコンテナへアクセスできるように設定していました。
しかし、実際に make exec
を実行した際に、思わぬエラーが発生し、その原因と解決策を調べることになりました。
個人の備忘録程度の走り書きとなっておりますが、温かい目で見守っていただければ幸いです。
同じような問題に直面する人の助けになればと思い、この記事を書くことにしました。
Docker Composeで exec
時に発生するエラーの対処法
背景
Docker Compose を使って next-app
コンテナに入ろうとした際、以下のコマンドを実行しました:
make exec
Makefile の中身は以下のようになっていました:
exec:
docker compose exec -it next-app bash
このコマンドを実行したところ、以下の2つのエラーが発生しました。
エラー1:version
属性の警告
WARN[0000] ... the attribute `version` is obsolete, it will be ignored, please remove it to avoid potential confusion
原因
docker-compose.yml
に書かれている version:
属性が現在の仕様では不要になっています。
解決策
docker-compose.yml
の冒頭にある以下のような行を削除します:
version: '3.8' # ← この行を削除
これは警告であり、動作には支障ありませんが、今後のために削除しておくとよいでしょう。
エラー2:bash
が見つからない
OCI runtime exec failed: exec failed: unable to start container process: exec: "bash": executable file not found in $PATH: unknown
原因
使用しているコンテナイメージに bash
がインストールされていない可能性が高いです。
特に、Node.js の Alpine ベースイメージなどでは bash
が入っていません。
過去の記事
解決策
代わりに sh
(標準シェル)を使用します。
以下のように bash
を sh
に変更してください:
make exec
Makefile の内容を以下のように変更します:
exec:
docker compose exec -it next-app sh
これにより、コンテナに問題なく入れるようになります。
まとめ
-
docker-compose.yml
のversion:
は削除してもOK -
bash
が無い場合はsh
に切り替える - Makefile でコマンドを簡略化しておくと便利
Docker のトラブルはよくあることなので、柔軟に対処できるようになっておくと安心です!