YAML の マージ してより見やすく実装をしてみよう!

2021年4月19日

この記事ではdocker-composeで利用する YAML 形式のファイルについて、 マージ (アンカーとエイリアス)の方法をご紹介します。

 

docker-composeの実装ファイル

Dockerコンテナを作成・管理する際非常に重宝するのがdocker-composeです。
定番中の定番ツールですよね。

このdocker-compose必ず使用するのファイルがdocker-compose.ymlです。
※ファイル名はこの別名を指定することもできますが特に指定しない場合、docker-comoseはdocker-compose.ymlを読み込むようになっています。

このファイルはYAMLというフォーマットで記述していきます。なんだか聞きなれないフォーマットですよね。
巷ではHTMLやXMLが有名で、JSON形式のデータも認知度が高まってきているかと思います。YAMLはこれらの仲間です。

一例を挙げましょう

下記がdocker-compose.ymlの一例となります。
私が使用を検討していたWordPressコンテナの定義です。

version: '3'
#ワードプレス
services:
 db:
   image: mysql:5.7
   #container_name: "mysql57"
   volumes:
     - ./db/mysql:/var/lib/mysql
   restart: always
   environment:
     MYSQL_ROOT_PASSWORD: fuga
     MYSQL_DATABASE: wordpress_db
     MYSQL_USER: user
     MYSQL_PASSWORD: hoge
   logging:
     driver: "json-file"
     options:
       max-size: "100m"
       max-file: "3"
 wordpress:
   image: wordpress:latest
   #container_name: "wordpress"
   volumes:
     - ./wordpress/html:/var/www/html
     - ./php/php.ini:/usr/local/etc/php/conf.d/php.ini
   restart: always
   depends_on:
     - db
   ports:
     - 80:80
   environment:
     WORDPRESS_DB_HOST: db:3306
     WORDPRESS_DB_NAME: wordpress_db
     WORDPRESS_DB_USER: user
     WORDPRESS_DB_PASSWORD: hoge
   logging:
     driver: "json-file"
     options:
       max-size: "100m"
       max-file: "3"

全体の説明は割愛します。
今日はここに注目してください。

   logging:
     driver: "json-file"
     options:
       max-size: "100m"
       max-file: "3"

同じ記述がこのファイルでは2回登場しています。
プログラムの世界では「同じコードは2度書くな!」という格言があります。
(嘘です)
しかし同じコードを見ればまとめたくなるのがプログラマーの特徴ですよね(笑

YAMLではこのようなコードは「アンカーとエイリアス」を使用してまとめることができます。
プログラムでいう変数みたいなものですね。実際にどのように記載するのか見てみましょう。

version: '3'

#ワードプレス
services:
 db:
   image: mysql:5.7
   #container_name: "mysql57"
   volumes:
     - ./db/mysql:/var/lib/mysql
   restart: always
   environment:
     MYSQL_ROOT_PASSWORD: fuga
     MYSQL_DATABASE: wordpress_db
     MYSQL_USER: user
     MYSQL_PASSWORD: hoge
   logging: &logging_hoge   # ★注目
     driver: "json-file"
     options:
       max-size: "100m"
       max-file: "3"
 wordpress:
   image: wordpress:latest
   #container_name: "wordpress"
   volumes:
     - ./wordpress/html:/var/www/html
     - ./php/php.ini:/usr/local/etc/php/conf.d/php.ini
   restart: always
   depends_on:
     - db
   ports:
     - 80:80
   environment:
     WORDPRESS_DB_HOST: db:3306
     WORDPRESS_DB_NAME: wordpress_db
     WORDPRESS_DB_USER: user
     WORDPRESS_DB_PASSWORD: hoge
   logging: *logging_hoge    # ★注目

最初に登場したloggingの定義部分で&logging_hogeという名前を付けて
次に登場するloggingの部分ではその定義を*logging_hogeで呼び出しています。

こうすると同じ定義を2回記述しなくて済みますよね!

構文チェック

この記載が正しいのか、docker-composeにはconfigというオプションがあります。
このオプションを使用すると構文がチェックされて最終的に実行されるYAMLコードを出力することができます。

docker-compose config
services:
  db:
    environment:
      MYSQL_DATABASE: wordpress_db
      MYSQL_PASSWORD: hoge
      MYSQL_ROOT_PASSWORD: fuga
      MYSQL_USER: user
    image: mysql:5.7
    logging:
      driver: json-file
      options:
        max-file: '3'
        max-size: 100m
    restart: always
    volumes:
    - /Docker/files/hoge/db/mysql:/var/lib/mysql:rw
  wordpress:
    depends_on:
      db:
        condition: service_started
    environment:
      WORDPRESS_DB_HOST: db:3306
      WORDPRESS_DB_NAME: wordpress_db
      WORDPRESS_DB_PASSWORD: hoge
      WORDPRESS_DB_USER: user
    image: wordpress:latest
    logging:
      driver: json-file
      options:
        max-file: '3'
        max-size: 100m
    ports:
    - published: 80
      target: 80
    restart: always
    volumes:
    - /Docker/files/hoge/wordpress/html:/var/www/html:rw
    - /Docker/files/hoge/php/php.ini:/usr/local/etc/php/conf.d/php.ini:rw
version: '3'

loggingの部分に注目してください。
正しく割り当てられているのがわかりますよね。
YAMLはほかにも便利な書き方がたくさんあります。
これらを駆使してきれいなコードを目指したいものですよね。

 

仮想,言語Docker,YAML

Posted by raika@blog