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
- 機能
- 環境変数作成する
- 初期値を設定する
- 補足
- docker runの実行オプション「-e」で変更可能
- 参考
- ENVとLinuxのexportの違いを説明した記事
EXPOSE
EXPOSE 5000
- 機能
- アプリがリスンしているポートを設定
- ブラウザからコンテナ実行された環境のアプリに接続できるようになる
- 参考
- EXPOSEを利用している参考記事
動作指定
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」ディレクトリ配下
- 引数1つ目
- 参考
- 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"
- コマンドを「"」でくくる
- コマンドのスペースはそのまま
リファレンス
- Dockerfile reference | Docker Documentation
- Dockerファイルについて
- docker build | Docker Documentation
- docker buildコマンドのコマンドリファレンス
- Best practices for writing Dockerfiles | Docker Documentation
- Dockerファイルのベストプラクティス

