新しい言語について学ぶ前ににわかDocker知識をマシにする(後編1)

docker-composeファイルについて

docker-compose.ymlという名前で作成するが、実際に実行する際にオプションでファイル名を指定できるので、別の名前でも問題ない。

 

普段見かけないオプションがかなり多かったため、分けてみていくことにする。

 

下記ドキュメント内に記載されている記述に沿っていきつつ見ていく。(バージョンは3であり、1や2とは若干異なる)

Compose ファイル version 3 リファレンス — Docker-docs-ja 20.10 ドキュメント

version: "3.9"
services:
  webapp:
    build:
      context: ./dir
      dockerfile: Dockerfile-alternate
      args:
        buildno: 1

 

version

docker-composeファイルのバージョンを記述する

 

services

この下に実際にコンテナの設定を記述する。複数コンテナの設定を記述することもできる

 

webapp

コンテナ名。docker-composeファイルで複数コンテナを立ち上げた際、別コンテナにアクセスしたい時にホスト名ではなくコンテナ名を設定ファイルなどに記述することでアクセスができるため、appやdbなどそのコンテナが持つ役割を示す名前にすると分かりやすい

 

以下はコンテナに関する設定となる

build

ビルドコンテキストのパスを指定できるオプション

実際に使用したことのないオプションが出てきたため、ビルドコンテキストを理解する

Dockerfile 記述のベストプラクティス | Docker ドキュメント

docker buildコマンドを実行したときの、カレントなワーキングディレクトリのことを ビルドコンテキスト(build context)と呼びます。 

docker buildコマンドを実行したときのディレクトリのことを指す。

カレントディレクトリ配下にあるファイルやディレクトリの内容がすべて、ビルドコンテキストとして Docker デーモンに送られることになります。

また、docker build実行時のディレクトリ配下にあるファイル・ディレクトリはすべてコンテナ内に送られてしまうらしいので、設定ファイルなど最低限のファイル群のみを置いたほうがいいらしい

このため、

context

はコンテキストのパスを指定していることがわかる

dockerfile

こちらは、コンテナビルド時に使用するdockerfileの名前

args

はコンテナビルド時に指定する引数を示している。

dockerfileにて定義した変数に対して、docker-composeファイルで渡した値を代入できるらしい

 

記載はないが、

image

についてはdocker buildを行う時に使用するイメージのことで、

dockerfileかイメージどちらかを使用することになる。

 

cache_from

説明を読むと、

Engine がキャッシュの解決に使うイメージの一覧。

とある。

これだけだとよくわからないのでいろいろと調べると、おそらくビルド高速化に有効な、ビルド時に生成されるキャッシュだということがわかった。

dockerfileを変更しても変更が反映されないときに削除する…という旨のブログがいくつか散見されたが、これは逆に利用するためのオプションのようだ

Best practices for writing Dockerfiles | Docker Documentation

build:
  context: .
  cache_from:
    - alpine:latest
    - corp/web_app:3.14

このため、上記の記述は既にpullしてビルドに使われている(キャッシュがある)イメージだと思われる

 

labels

ビルドした際にコンテナにラベルを付与することができる。

ラベルについてのドキュメントは以下

Docker オブジェクト・ラベル — Docker-docs-ja 20.10 ドキュメント

ラベルを付与しておくと、docker ps でコンテナを探す際のフィルタリングにも使用できるため、

多くのコンテナができてしまう前に付与しておくとよさそうだ。

ラベルはキーと値の関係になっていて、

キー名: 値

build:
  context: .
  labels:
    com.example.description: "Accounting webapp"
    com.example.department: "Finance"
    com.example.label-with-empty-value: ""

または

build:
  context: .
  labels:
    - "com.example.description=Accounting webapp"
    - "com.example.department=Finance"
    - "com.example.label-with-empty-value"

- キー名=値

の形式どちらかで書くことができる