目次
環境変数
環境変数の展開
bashと同じ形式で展開できる
web:
  image: "webapp:${TAG}"
デフォルトではdocker compose実行時のカレントディレクトリ直下の.envファイルが参照される
$ echo TAG=1.0 > ./.env
web:
  image: "webapp:${TAG}" # -> webapp:1.0
--env-fileコマンドラインオプションで環境変数ファイルを指定できる
パスはカレントディレクトリからの相対パスになる
$ docker compose --env-file ./config/.env.dev up 
コンテナ内環境変数の指定
environmentキーで指定
web:
  environment:
      - DEBUG=1
シェル上の環境変数を参照する
$ export DEBUG=1
web:
  environment:
      - DEBUG # -> 1
環境変数ファイルを指定する:env_fileキー
DockerfileのARG、ENV よりも優先される
ymlファイル内で環境変数が直接設定された場合はそちらが優先
$ echo DEBU=1 > .env.dev
web:
  env_file:
      - ./.env.dev
Composeが使う環境変数はCOMPOSE_またはDOCKER_から始まる
環境変数一覧:https://docs.docker.com/compose/environment-variables/
プロフィール
プロフィールをサービスに割り当てる
profilesキーで指定できる
正規表現も可能
以下の場合、プロフィールがfrontendに設定されていない場合はbackendとdbのみ起動する
メインとなるサービスは常時起動できるようにプロフィールを設定しないのが吉
version: "3.9"
services:
  frontend:
    image: frontend
    profiles: ["frontend"]
  phpmyadmin:
    image: phpmyadmin
    depends_on:
      - db
    profiles:
      - debug
  backend:
    image: backend
  db:
    image: mysql
プロフィール有効化
コマンドラインオプションで設定する方法
$ docker-compose --profile debug up
コマンド前に環境変数を設定する方法:COMPOSE_PROFILES環境変数
$ COMPOSE_PROFILES=debug docker-compose up
複数プロフィールの有効化
$ docker-compose --profile debug --profile frontend up
$ COMPOSE_PROFILES=debug,frontend docker-compose up
プロフィールの自動有効化
profilesキーに設定されたプロフィールはdocker compose run実行時に有効化される
version: "3.9"
services:
  backend:
    image: backend
  db:
    image: mysql
  db-migrations:
    image: backend
    command: myapp migrate
    depends_on:
      - db
    profiles:
      - tools
# backend と db のみ起動
$ docker-compose up -d
# こちらは db-migrations を実行(必要となる db も起動)するにあたり、
# プロフィール `tools` を自動的に有効化
$ docker-compose run db-migrations
依存関係にあるサービスは自動有効化されないので、個別にプロフィールを有効化するか、依存対象と同一のプロフィールにする
設定の共有
複数のComposeファイル
基盤となるdocker-compose.ymlファイルのほかに、docker-compose.override.ymlに追加の設定を記述すれば、docker compose up実行時に自動で読み込まれる
web:
  image: example/my_web_app:latest
  depends_on:
    - db
    - cache
db:
  image: postgres:latest
cache:
  image: redis:latest
``.
```yml:docker-compose.override.yml
web:
  build: .
  volumes:
    - '.:/code'
  ports:
    - 8883:80
  environment:
    DEBUG: 'true'
db:
  command: '-d'
  ports:
    - 5432:5432
cache:
  ports:
    - 6379:6379
明示的にファイルを指定する場合は-fオプション
$ docker-compose -f docker-compose.yml -f docker-compose.prod.yml up -d
ネットワーク
コンテナからコンテナのアクセス
v2.1以上だとデフォルトでattachableであり、サービス名でコンテナにアクセスできない
attachableキーワードにfalseを設定すれば非有効化できる
linksキーワード
デフォルトの「サービス名=ホスト名」以外に別名を設定できる
以下の場合にはdbあるいはdatabaseでも接続できる
linksリファレンス:https://docs.docker.jp/compose/compose-file/compose-file-v2.html#compose-file-links
version: "3.9"
services:
  web:
    build: .
    links:
      - "db:database"
  db:
    image: postgres
任意のネットワークを指定
networksキーを使う
以下の場合、proyxyサービスはdbサービスから分離されるが、appサービスとdbサービスはネットワークを共有している
networksキーリファレンス:https://docs.docker.jp/compose/compose-file/compose-file-v2.html#network-configuration-reference
version: "3.9"
services:
  proxy:
    build: ./proxy
    networks:
      - frontend
  app:
    build: ./app
    networks:
      - frontend
      - backend
  db:
    image: postgres
    networks:
      - backend
networks:
  frontend:
    # Use a custom driver
    driver: custom-driver-1
  backend:
    # Use a custom driver which takes special options
    driver: custom-driver-2
    driver_opts:
      foo: "1"
      bar: "2"
nameキーワードで任意の名前も設定できる
version: "3.9"
services:
  # ...
networks:
  frontend:
    name: custom_frontend
    driver: custom-driver-1
アプリケーション全体のデフォルトネットワークを設定
defaultエントリに定義できる
version: "3.9"
services:
  web:
    build: .
    ports:
      - "8000:8000"
  db:
    image: postgres
networks:
  default:
    # 任意のドライバを使う
    driver: custom-driver-1
既存ネットワークを使用
externalオプションを使用
以下ではmy-pre-existing-networkという名前のネットワークを探す
services:
  # ...
networks:
  default:
    name: my-pre-existing-network
    external: true
起動順、停止順の制御
depends_onキーで行う
あくまで起動順を制御するだけで準備が整うまでは待たないので、別途ラッパースクリプトなどを用意する
version: "2"
services:
  web:
    build: .
    ports:
      - "80:8000"
    depends_on:
      - "db"
    command: ["./wait-for-postgres.sh", "db:5432", "--", "python", "app.py"]
  db:
    image: postgres
#!/bin/sh
# wait-for-postgres.sh
set -e
host="$1"
shift
until PGPASSWORD=$POSTGRES_PASSWORD psql -h "$host" -U "postgres" -c '\q'; do
  >&2 echo "Postgres is unavailable - sleeping"
  sleep 1
done
>&2 echo "Postgres is up - executing command"
exec "$@"
