docker-compose でコンテナを起動するときに次のような問題が発生しました。
複数のプロジェクト内に同じ名前のディレクトリを作成して、その中に docker-compose.yml を作ってしまい識別しにくい状況になるケースです。
これらを解決する方法がいくつかあったので紹介したいと思います。
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
がオススメです。
docker-compose -p another-name up -d
COMPOSE_PROJECT_NAME=another-name docker-compose up -d
docker-compose.yml
ファイルにcontainer_name
を設定するdocker-compose.yml
と同じディレクトリに.env
を作成して設定する以降ではそれぞれの指定方法による特徴を説明します。
docker-compose -p another-name up -d
のように-p
を指定することでプロジェクト名を変更して起動することができます。
最大のデメリットはdocker-compose
のサブコマンドを実行する場合に、同様のオプションとパラメータを必要とします。
例えばdocker-compose down
やdocker-compose ps
などを実行するたびに必要となり、煩雑なうえに忘れがちになります。
COMPOSE_PROJECT_NAME
の環境変数に値を指定することで任意のプロジェクト名で起動することができます。
こちらも-p
オプション同様にdocker-compose down
の場合に環境変数の指定が必要となります。
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
docker-compose up -d --scale nginx=2
のようにしても、container_name
は固定された名称を設定するため、スケールができなくなります。
docker-compose
コマンドはdocker-compose.yml
と同じ場所の.env
ファイルを自動的に参照します。
この方法は公式ドキュメントでも見つけられず、もしかすると.env
に書いておけばいけるんじゃないかと思い試した結果、見事に反映されました。
以下のように.env
ファイルを作成し、環境変数を設定して、docker-compose up -d
するだけです。
COMPOSE_PROJECT_NAME=another-project
この方法であればdocker-compose down
するときに、わざわざオプションや環境変数を指定する必要がなくなります。