新しい言語について学ぶ前ににわか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"
- キー名=値
の形式どちらかで書くことができる