1. okashoi

    Posted

    okashoi
Changes in title
+【Docker Compose】container_name ではなくて COMPOSE_PROJECT_NAME 変数を使うと良さそう
Changes in tags
Changes in body
Source | HTML | Preview
@@ -0,0 +1,51 @@
+## 背景
+
+`docker-compose.yml` 内で `container_name` を指定することで、コンテナ名を明示することができる。
+
+```yml:docker-compose.yml
+version: "3"
+
+services:
+ web:
+ container_name: myapp_web
+ image: php:7.1-apache
+```
+
+上記 `docker-compose.yml` が置いてある場所で `docker-compose up` すると `myapp_web` という名前でコンテナが立ち上がる。
+
+しかし、これでは名前の重複によって、同じコンテナを複数立ち上げることができない。
+
+## そこで `COMPOSE_PROJECT_NAME` 変数の出番
+
+一方で `container_name` を指定しない場合、コンテナ名は自動的に「`COMPOSE_PROJECT_NAME` 変数 + `_` + サービス名 + `_` + 連番」となる。
+
+つまり
+
+```yml:docker-compose.yml
+version: "3"
+
+services:
+ web:
+ image: php:7.1-apache
+```
+
+```:.env
+COMPOSE_PROJECT_NAME=myapp
+```
+
+のようにして `docker-compose up` を実行すると、自動的に `myapp_web_1` という名前がつけられたコンテナが立ち上がってくれる。
+
+コンテナ名を決める要素を `.env` に切り出せる、名前が機械的に決定される、という意味でもこの方法が好ましそう。
+
+## 余談
+
+この `COMPOSE_PROJECT_NAME` 変数はコンテナ内からは参照できない。
+
+`docker` コマンドを叩くときの変数ではなく、`docker-compose` コマンド自体を叩くときの変数だからである。
+
+なので `docker-compose.yml` 内で `env_file` や `environmet` を使って設定する変数とは別のものである(慣れないと混乱しがち)。
+
+## 参考
+
+* https://docs.docker.com/compose/env-file/
+* https://docs.docker.com/compose/reference/envvars/