💋

dockerfileの設定コマンド②

2021/02/05に公開

はじめに

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

概要

■dockerfileのコマンド
■ENTRYPOINT
■CMD
■ENV
■ARG

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

■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 <名前>[=<デフォルト値>]|ビルド時の引数を定義する--bild-arg<引数>=<値>|
|LABEL key=value key=value|イメージのメタデータにラベルを追加する|
|MAINTAINER<名前>|イメージのメタデータに製作者を追加する|
ルールがたくさんある!('_')

dockerfileはGO言語で記述する。

■ENTRYPOINT

コンテナが実行するファイル、コマンド、引数を指定する。
記述形式は exec 形式、shell形式の2つがある。

ENTRYPOINT記述形式
・exec形式
ENTRYPOINT ["実行バイナリ", "パラメータ1", "パラメータ2"] 
・shell形式
ENTRYPOINT コマンド パラメータ1 パラメータ2
ENTRYPOINT コマンド

※「ENTRYPOINT」および「CMD」を記述することで実行するコマンドおよび引数を事前に定義でき、「docker run」コマンド実行時に省略できるようになる。
※ENTRYPOINT とCMD の両方が書いてある場合、ENTRYPOINTに書かれている内容がコマンドとなり、CMD に書かれている内容が、ENTRYPOINT に書いてあるコマンドオプションになる。

※「ENTRYPOINT」の場合は「docker run」で実行するコマンドおよび引数を上書きすることはできない。ENTRYPOINTを実行したい場合、コンテナ起動時に次のように指定する。

コンテナ実行時
docker run --entrypoint="" 

で実行することができる。
※ENTRYPOINT とCMD の両方が書いてありdocker run 時に引数をつけた場合、CMD の内容が上書きされENTRYPOINT に書いてあるコマンドが実行される。
※1つのDockerfile にCMD、ENTRYPOINT は1度のみ指定できる。
※ENTRYPOINTで 複数コマンドが記述されている場合、最後の1個が実行されてしまう。

■CMD

コンテナ実行時に実行されるファイル、コマンド、引数を指定する。
CMD には3つの記述形式がある。

・exec 形式
CMD ["実行バイナリ", "引数1", "引数2"] 
・ENTRYPOINT の引数として記述
CMD ["引数1", "引数2"] 
・シェル形式
CMD コマンド 引数

※「ENTRYPOINT」および「CMD」を記述することで実行するコマンドおよび引数を事前に定義でき、「docker run」コマンド実行時に省略できるようになる。
※ENTRYPOINT とCMD の両方が書いてある場合、ENTRYPOINTに書かれている内容がコマンドとなり、CMD に書かれている内容が、ENTRYPOINT に書いてあるコマンドオプションになる。
※「CMD」の場合は「docker run」で実行するコマンドおよび引数を上書きできる。
※1つのDockerfile にCMD、ENTRYPOINT は1度のみ指定できる。
※ENTRYPOINT とCMD の両方が書いてありdocker run 時に引数をつけた場合、CMD の内容が上書きされENTRYPOINT に書いてあるコマンドが実行される。

■ENV(シェルで実行できる環境変数 )

ENV コマンドでは、**シェルで実行できる環境変数 と 値 **を設定することができる。値は Dockerfile から派生する全てのコマンド環境で利用できる。環境変数はシェルに引き継がれる。

環境変数の設定に ENV を指定すると、作成したイメージを使ってコンテナ起動後、環境変数が有効となる。
どのような値が設定されているかは docker inspect で確認でき、変更するには docker run --env key=value を使う。

ENV記述形式
ENV key value
ENV key=value ...
ENV記述例
ENV DB_HOST="192.168.2.201" \
    DB_PORT="3306" \
    DB_USER="myapp" \
    DB_PASSWD="ZbGc7#adG87GBfVC" \
    DB_DATABASE="sample"

■ARG(Dockerfile 内で使用できる環境変数)

Dockerfile 内で使用できる変数を指定する。ENV による環境変数がシェルに引き継がれるのに対し、ARG による変数は Dockerfile の中のみで使用となる。

ARG記述形式
ARG 名前(=デフォルト値)

ARGコマンドは、構築時に作業者が docker build コマンドで使う変数、 --build-arg 変数名=値を先に定義するものとなる。 docker build コマンドの引数として値を渡す。
ユーザーがdocker build 時に変数名=値を指定しても Dockerfile でARGが定義されていなければ、構築時にエラーが出る。

ARG 変数は Dockerfile で記述した行以降で使用可能となる。(※ただし、コマンドライン上で引数の指定が無い場合に限る)

ARG記述例
ARG user=unknown
RUN echo $user                 => unknwon

まとめ

.   ┗┯┛
 ./ / │ \
    │
     ∩  もう寝る
  <⌒/ヽ-、いい夢見ろよ
/<_/____ /

Discussion