docker-composeでプロジェクト名を変更する

docker-compose でコンテナを起動するときに次のような問題が発生しました。

複数のプロジェクト内に同じ名前のディレクトリを作成して、その中に docker-compose.yml を作ってしまい識別しにくい状況になるケースです。

これらを解決する方法がいくつかあったので紹介したいと思います。

docker-compose のプロジェクト名とは

docker-compose up -dの実行後に表示されるNameです。

docker psの場合はNAMESになります。

# docker-compose ps
     Name              Command          State   Ports
------------------------------------------------------
docker_nginx_1   nginx -g daemon off;   Up      80/tcp
docker_nginx_2   nginx -g daemon off;   Up      80/tcp

このプロジェクト名は、起動時に何も指定しない場合docker-compose.ymlのディレクトリ名が採用されます。

プロジェクト名の変更方法

プロジェクト名の変更にはいくつかの方法があり、結論から言うと 4 の.envがオススメです。

  1. docker-compose -p another-name up -d
  2. COMPOSE_PROJECT_NAME=another-name docker-compose up -d
  3. docker-compose.ymlファイルにcontainer_nameを設定する
  4. docker-compose.ymlと同じディレクトリに.envを作成して設定する

以降ではそれぞれの指定方法による特徴を説明します。

1. -p オプションによる指定

docker-compose -p another-name up -dのように-pを指定することでプロジェクト名を変更して起動することができます。

-p オプションのデメリット

最大のデメリットはdocker-composeのサブコマンドを実行する場合に、同様のオプションとパラメータを必要とします。

例えばdocker-compose downdocker-compose psなどを実行するたびに必要となり、煩雑なうえに忘れがちになります。

2. 環境変数による指定

COMPOSE_PROJECT_NAMEの環境変数に値を指定することで任意のプロジェクト名で起動することができます。

こちらも-pオプション同様にdocker-compose downの場合に環境変数の指定が必要となります。

3. container_name を指定する

docker-compose.yml のサービス別に指定する方法です。 以下のように、container_nameに別名を指定します。

version: '3'

services:
  nginx:
    image: nginx:alpine
    container_name: web

この設定で起動するとpsの NAMES が変わります。

# docker-compose ps
Name         Command          State   Ports
--------------------------------------------
web    nginx -g daemon off;   Up      80/tcp

container_name のデメリット

docker-compose up -d --scale nginx=2のようにしても、container_nameは固定された名称を設定するため、スケールができなくなります。

4. .env で指定する

docker-composeコマンドはdocker-compose.ymlと同じ場所の.envファイルを自動的に参照します。

この方法は公式ドキュメントでも見つけられず、もしかすると.envに書いておけばいけるんじゃないかと思い試した結果、見事に反映されました。

以下のように.envファイルを作成し、環境変数を設定して、docker-compose up -dするだけです。

COMPOSE_PROJECT_NAME=another-project

この方法であればdocker-compose downするときに、わざわざオプションや環境変数を指定する必要がなくなります。