Dockerファイル:【書き方】と【使い方】


Dockerファイルとは?

まずイメージ(Dockerイメージ)とは

  • OSやアプリなど構築する環境がまとまったもの
  • コンテナとして実行することで利用できるようになる
  • 似た環境は一から作らずにベースになるイメージをカスタマイズして作る

Dockerファイルとは

  • 設定ファイル
    • イメージをどのように作成するか構築方法を記載
    • カスタマイズをDockerファイルとしてまとめる
  • 記載内容の例
    • 流用するイメージがあればダウンロードを指示
    • 必要なアプリがあればインストールを指示
    • ディレクトリ構成やファイル配置を指示
    • コンテナ実行時に実行するコマンド(やアプリ)を指示
  • 使い方(イメージ作成)
    • 「docker build」コマンドで実行
    • 「Dockerfile」と言う名前にする(他の名前にもできる)

使い方(docker build)

  • 使い方は3つある
  • Dockerファイルを作成する
    ① デフォルトのDockerファイル名を使う
    ② 任意のDockerファイル名にする
  • Dockerファイルを作成しない
    ③ ヒアドキュメントを利用

①デフォルトのDockerファイル名を使う

docker build .
  • 「.」
    • Dockerファイルの配置先はカレントディレクトリ
    • 言い換えると、
      • カレントディレクトリにDockerファイルがあることを確認
      • docker buildを実行
  • Dockerファイル名
    • 「Dockerfile」
    • このファイル名でDockerファイルを作成する
    • そうするとファイル名の指定が不要になる

②任意のDockerファイル名にする

docker build -f /path/to/a/Dockerfile .
  • -f
    • Dockerファイルの場所を指定する
    • ファイル名も任意にできる
  • 「.」
    • ビルドコンテキストの指定
    • 「.」はカレントディレクトリを指す
  • 参考
    • ビルドコンテキスト
      • イメージに取り込むファイルが格納されているディレクトリ
    • 詳細説明した記事

③ヒアドキュメントを利用

sudo docker build -t sample-image -<<+
FROM alpine
+
$ sudo docker build -t sample-image -<<+
FROM alpine
+
Sending build context to Docker daemon  2.048kB
Step 1/1 : FROM alpine
 ---> c059bfaa849c
Successfully built c059bfaa849c
Successfully tagged sample-image:latest

$ sudo docker images
REPOSITORY                  TAG       IMAGE ID       CREATED        SIZE
alpine                      latest    c059bfaa849c   2 months ago   5.59MB
sample-image                latest    c059bfaa849c   2 months ago   5.59MB
hello-world                 latest    feb5d9fea6a5   4 months ago   13.3kB
ubuntu                      12.04     5b117edd0b76   4 years ago    104MB
dockersamples/static-site   latest    f589ccde7957   5 years ago    191MB
  • 「-」
    • 続けてヒアドキュメントを記載

「#」で始まる行

コメント(通常)

# Comment
  • コメント行
  • 行頭に「#」

コメント(実行コマンドの中)

RUN echo hello \
# comment
world
  • 利用条件
    • 「\」で改行コードをエスケープして複数行になっている場合
      • この例では「RUN」~「world」までが1つのコマンド
    • 1つのコマンドの間にコメント行を記載できる

「# syntax…」

# syntax=docker/dockerfile:1
  • 意味
    • 自動更新設定
    • 最初に書いておく
    • 更新を自動で受け取るかと言う設定
  • 記載例
    • docker/dockerfile:1
    • docker/dockerfile:1.2
    • docker/dockerfile:1.2.1
  • 自動更新のタイミング
    • 「1」は「2」が出たら更新しなくなる
    • 「1.2」は「1.3.x」が出たら更新しなくなる
    • 「1.2.1」は更新しない
  • 参考
    • 詳細ドキュメント(Official releasesのところ)

設定

FROM

FROM alpine
FROM ubuntu:18.04
FROM python:3.7-alpine
  • 機能
    • ベースになるイメージを指定
    • 構築する環境に近いベースイメージが流用できる
    • 流用することで構築にかかる時間を短縮
    • 指定したイメージに含まれるOS環境となる
      • OSはLinuxに限定
      • ディストリビューションが異なる
  • 文法
    • <名称>:<バージョン>
    • バージョンを省略した場合「latest」になる
  • 補足
    • 以降のコマンドはベースイメージのOSで実行される
    • そのOSでサポートしていないコマンドはイメージ作成時に実行エラーとなる

WORKDIR

WORKDIR /code
  • 機能
    1.ワークディレクトリ作成
    2.作成したワークディレクトリにカレントディレクトリを移動
    • これらを同時に実行
  • 影響範囲
    • RUNやCMDなどイメージ作成時の実行コマンド
    • コマンド実行のカレントディレクトリがWORKDIRになる
  • 参考
    • WORKDIRの詳細を説明した記事

ENV

ENV FLASK_APP=app.py
ENV FLASK_RUN_HOST=0.0.0.0

EXPOSE

EXPOSE 5000

動作指定

COPY

COPY requirements.txt requirements.txt
COPY requirements.txt /usr/src/app/
COPY . .
COPY . /app
  • 機能
    • コピー元からコピー先にファイルやディレクトリをコピーする
    • 似ているコマンドにADDがある
  • 文法(COPY xxx xxx)
    • 引数1つ目
      • コピー元ファイルを指定
      • dockerコマンドを実行している環境
    • 引数2つ目
      • コピー先ディレクトリまたはファイル名を指定
      • イメージ(dockerイメージ)内
    • 例(COPY . /app)
      • コピー元:「.」(カレントディレクトリ)
      • コピー先:イメージ内の「/app」ディレクトリ配下
  • 参考
    • ADDを使うべきかどうかを説明した記事

RUN

RUN apk add --no-cache gcc musl-dev linux-headers
RUN pip install --no-cache-dir -r /usr/src/app/requirements.txt
RUN pip install -r requirements.txt
RUN make /app
RUN echo xxx > ./sample.txt
  • 機能
    • イメージ作成(docker build)時に実行するコマンド
    • コンテナ内のファイルやインターネット上のファイルを使って環境構築する
    • コンテナ内で処理を実行する
      (上記例ではecho出力をsample.txtにリダイレクト)
  • 注意点
    • 利用できるコマンドは構築する環境のOSに依存
    • 例えば、FROMで指定したベースイメージのOS

CMD

CMD python /app/app.py
CMD ["python", "/usr/src/app/app.py"]
CMD ["flask", "run"]
CMD "sh" "-c" "echo test"
CMD ["sh", "-c", "echo test"]
  • 機能
    • コンテナ実行(docker run)時に実行するコマンド
    • イメージが持つ機能を使えるようにする
    • 何かしらコマンド実行しないとコンテナはただの箱
  • 記載方法いろいろ
    • 実行アプリ名とオプションや引数を記載する
    • xxx xxx
      • 実行コマンドをそのまま記載
    • [“xxx","xxx"]
      • 全体を[]でくくる
      • コマンドのスペースを「,」に置き換える
    • “xxx" “xxx"
      • コマンドを「"」でくくる
      • コマンドのスペースはそのまま

リファレンス


Posted by futa