docker-compose execとrunの使い分け

bashを立ち上げてコンテナの中で色々作業したい時にどう使い分けるか整理した

docker-compose exec

  • docker-compose.ymlのportを使いたい時
  • すでに立ち上がってるコンテナに入るのでportの競合はしない
  • 基本こっちでいいと思う

docker-compose run

  • docker-compose.ymlのportを使いたくない時
  • オプションでportを指定できる(docker-compose.ymlに書いたportも使える)
  • 新しくコンテナを立ち上げるのでportが競合していると失敗する

解説

最初はMakefileにdocker-compose runで書いてたけど、2つbashを立ち上げたい時にportの問題に気付いた

ruby:
    docker-compose run --service-ports ruby bash

なのでexecを使う方式に変えた

ruby:
    docker-compose up -d ruby
    docker-compose exec ruby bash

upしてもコンテナがすぐに終了してしまう場合は、docker-compose.ymlでtty: trueにしておく必要がある

なお、docker-compose upは変更がなければ2回たたいても特に問題ない模様。