docker compose upでCLIツールのコンテナを起動しないようにする

次のようなdocker-compose.ymlを考える

services:
  mysql:
    image: mysql:8.0.30
    restart: always
    volumes:
      - mysql_data:/var/lib/mysql

  mysql-cli:
    image: mysql:8.0.30
    volumes:
      - ./docker/mysql:/opt/mysql
    working_dir: /opt/mysql
    command: ["mysql", "--defaults-extra-file=/opt/mysql/client-extra.conf", "db_name"]

docker compose upmysqlは起動してほしいが、mysql-cliは起動してほしくない。実際のところupでmysql-cliが起動しても即座に終了するため問題はないのだが気分はよろしくない

このような場合はprofilesを使うと起動対象から除外できる

services:
  mysql:
    image: mysql:8
    restart: always
    volumes:
      - mysql_data:/var/lib/mysql

  mysql-cli:
    image: mysql:8
    volumes:
      - ./docker/mysql:/opt/mysql
    working_dir: /opt/mysql
    command: ["mysql", "--defaults-extra-file=/opt/mysql/client-extra.conf", "db_name"]
    profiles:
      - one-off

profileの名前はなんでもいいが、not-service とか one-off 等にしておくと分かりやすいだろう

こうして docker compose up を実行するとmysqlは起動するがmysql-cliは起動しなくなる。mysql-cliを使うときは普通にrunで起動する。runはprofileに影響されない

docker compose run --rm mysql-cli

profilesは本来、環境ごとに起動するコンテナを変えるためのオプション。例えば本番環境ではauroraに接続するのでmysqlを使わない、phpMyAdminはローカル開発環境以外では起動して欲しくない、といったケースで用いるものらしい。

詳細は公式ドキュメントを参照されたい

Using profiles with Compose | Docker Documentation