📚

dockerfileのARGコマンドとLABELコマンド

2021/02/11に公開

はじめに

くーばねてすをやっつけるためにこれまでにLinuxさんとAWSさんと仲良くさせていただいたが、新たなステージに上がるためについにdockerさんに会いに行くことにした。dockerさんと仲良くなることでコンテナシステムの仕組みの理解とくーばねてすを倒すための調査をする。
今回はdockerさんでコンテナを開発して、くーばねてすでの構築の基礎的な部分を理解する。

概要

■dockerfileのコマンド
■ARG
■LABEL

をまとめた!(^_-)-☆

■dockerfileのコマンド

dockerfile命令(コマンド)、意味ざっくり
|コマンド|意味|
| --- | --- | --- |
|FROM イメージ:タグ|コンテナのベースイメージ|
|RUN コマンド|FROMのベースイメージで実行するコマンド|
|ADD ソース コンテナ内宛先|ソースをコンテナ内宛先へコピーする|
|ENTRYPOINT |コンテナが実行するファイルを指定する|
|CMD|コンテナの実行時に実行されるコマンドを指定する|
|ENV key=Value|環境変数をセットする|
|EXPOSE port|公開ポートを設定する|
|USER ユーザ名|RUN,CMD,ENTRYPOINTの実行ユーザを指定する|
|VOLUME["/path"]|共有可能なボリュームをマウントする|
|WORKDIR /path|RUN,CMD,ENTRYPOINT,COPY,ADDの作業ディレクトリを指定する|
|ARG <名前>[=<デフォルト値>]|ビルド時の引数を定義する--bid-arg<引数>=<値>|
|LABEL key=value key=value|イメージのメタデータにラベルを追加する|
|MAINTAINER<名前>|イメージのメタデータに製作者を追加する|
ルールがたくさんある!('_')

■ARG

ARG 命令は、構築時に作業者が docker build コマンドで使うことができる変数を指定できる。
ARGコマンドはビルド時に実行できる変数を定義する。
シェルに渡す環境変数ではなく、 docker build コマンドの引数として値を渡す機能を持つ。

dockerfile
ARG 名前(=デフォルト値)
dockerビルド時で指定する変数のことだ
$ docker build --build-arg 変数名=値 ...

指定したビルド引数(build argument)が Dockerfile 内において定義されていない場合は、ビルド処理できないので警告メッセージが出力される。

One or more build-args were not consumed, failing build.

定義したARGの変数はdockerfile内のADD, COPY, WORKDIR, RUN, USER, ENVコマンドで使用できる。

FROM busybox
ARG hoge
RUN echo $hoge

↓ARGコマンドで指定した変数にビルド時に値を指定して実行する。

docker build ./ --build-arg hoge=helloworld

ビルド時に値を指定しなくてもARGコマンドでデフォルト値を設定することで省略できる。

dockerfile
FROM busybox
ARG hoge="helloworld"
RUN echo $hoge

dockerfileでデフォルト値を指定したがビルド時に違う値を指定した場合、ビルド時の引数が優先される。

FROM ubuntu
ARG CONT_IMG_VER
ENV CONT_IMG_VER ${CONT_IMG_VER:-v1.0.0}
RUN echo $CONT_IMG_VER
$ docker build --build-arg CONT_IMG_VER=v2.0.1 Dockerfile

→引数を設定した場合、v2.0.1。指定しない場合、v1.0.0となる。

FROM よりも前にARG コマンドで変数を指定すると、FROMコマンドまでの間でARG変数が実行され、FROM以降の命令において最初のARG変数は使用できない。
なのでFROM以降の命令でARGで変数を設定したいときはまたARGコマンドを指定する必要がある。

dockerfile
ARG VERSION=latest
FROM busybox:$VERSION
ARG VERSION
RUN echo $VERSION > image_version

一つのビルドステージで複数の変数指定もできる。

複数の変数指定もできるぞ
FROM busybox
ARG user1=someuser
ARG buildno=1 

マルチビルドステージでdockerfileを作成するときはその都度ARGを指定する必要がある。

FROM busybox
ARG SETTINGS
RUN ./run/setup $SETTINGS

FROM busybox
ARG SETTINGS
RUN ./run/other $SETTINGS

https://matsuand.github.io/docs.docker.jp.onthefly/develop/develop-images/multistage-build/

■LABEL

LABEL コマンドはイメージに対してメタデータを追加する。 LABEL ではキーバリューペアによる記述を行う。値の指定は、コマンドライン処理と同様に空白にダブルクォート"や改行にバックスラッシュ\を使用する。

記述形式
LABEL <key>=<value> <key>=<value> <key>=<value> ...
または
LABEL <key>=<value>
LABEL <key>=<value>
LABEL <key>=<value>
1行ずつかくこともできるし
LABEL "com.example.vendor"="ACME Incorporated"
LABEL version="1.0"
LABEL description="This text illustrates \
that label-values can span multiple lines."
1行にまとめて書いてもいい
LABEL multi.label1="value1" multi.label2="value2" other="value3"

イメージのラベルを参照するには docker inspect コマンドで確認できる。

ラベルを確認
docker inspect [オプション] イメージ(コンテナ)

まとめ

会社で応接用のテーブルを組み立てたんだけど、説明書読まないで脚を内側に固定して完成として、最近テーブルの脚の根本がくねくね曲がってあそびがあるなと思ったら本当は外側に固定だったらしい。
社長はくねくね曲がるテーブルを必死で動かないように支えながらお客さんとお話してたみたいでお茶こぼれなくて良かったと思う。

Discussion