docker-compose exec が動かないとき

投稿者: | 2020年2月4日

自分の開発環境は Docker Desktop を使っているのですが、最近バージョンアップ(2.2.0.0)したら、docker-compose execを実行しようとすると次のようなエラーが表示されるようになりました。

Traceback (most recent call last):
  File "docker-compose", line 6, in <module>
  File "compose\cli\main.py", line 72, in main
  File "compose\cli\main.py", line 128, in perform_command
  File "compose\cli\main.py", line 491, in exec_command
  File "compose\cli\main.py", line 1469, in call_docker
  File "subprocess.py", line 172, in call
  File "subprocess.py", line 394, in __init__
  File "subprocess.py", line 644, in _execute_child
TypeError: environment can only contain strings
[7760] Failed to execute script docker-compose

これはどうもdocker-composeが読み込む環境ファイル .env の形式に問題があるようです。
自分はdocker-compose.yml は Laravelのトップディレクトリに置いているのですが、このような方式ですと、 docker-compose exec を実行するときLaravelの.envを読み込んでしまい、当然docker-compose用には記述されていませんので、上記のエラーが発生しているようです。

この不具合は最新のdocker-composeでは修正されているのですが、Docker Desktopに同梱されているdocker-composeはまだ古いままです。
しばらくすれば対応されると思いますが、現状の解決方法としましては、次のようにします。

  • .env ファイルを .env2 などにリネーム
  • docker-compose exec を実行
  • .env2 を .envにリネーム

また、別の方法としましては、docker-compose.ymlを別のディレクトリに移して実行しても大丈夫のはずです。
とにかく、早くDocker Desktopがバージョンアップされることを祈ります。