はじめに
Dockerfileを読めるようになるために、Dockerfileの命令について意味をざっくりまとめました。
どう使うのかイメージがわかない命令も多いですが、とりあえず読めるようになるがゴールです。
公式ドキュメントに記載の内容を元にしています。
| Docker Documentation
この記事が役に立つ方
- Dockerfileの読み方がよく分からない
- Docker初心者
この記事のメリット
- Dockerfileの命令が何を示しているのかが(なんとなく)分かる。
環境
- macOS Mojave バージョン10.14.6
- シェル:zsh
- Docker:version 19.03.5, build 633a0ea
Dockerfileとは?
Dockerがイメージを構築するときに読み込むファイルです。
基本構文は、
命令 引数
のようになります。
Dockerfileにイメージを構築するための命令を全て記述し、
$ docker build
でイメージが構築され、それを元に開発が可能となります。
つまり、Dockerfileが同じであれば、開発環境は一緒ということです。
Dockerfileに記述する命令一覧
公式ドキュメントにあるものを抜粋しました。
構文には触れていませんので、必要に応じて下記をご参照下さい。
| Docker Documentation
FROM
ベースイメージを指定する。
これを元にその他命令を追加していくため、最初はFROMから記述する必要がある。
DockerHubにあるイメージを使用。
RUN
それまでのイメージをベースに、新規レイヤーでシェルコマンドを実行する。
実行後出来たイメージは、以降の命令にも適用される。
CMD
docker run
時にデフォルトで実行するコマンドを指定することが出来る。
1つのDockerfileに1つしか含めることが出来ない。
ENTRYPOINT
docker run
時にデフォルトで実行するコマンドを指定することが出来る。
1つのDockerfileに1つしか含めることが出来ない。
CMDとの違いは下記記事で解説されています。
docker CMD とENTRYPOINT の違いを試してみた - Qiita
LABEL
コンテナイメージにメタデータを登録する。
過去MAINTAINER
で指定していた作者の情報も、LABEL
で指定するのが推奨とされている。
EXPOSE
ポートの開放を行う。
コンテナ間をリンクするときなどに使用。
ENV
環境変数を指定する。
ADD
ファイルやディレクトリ、リモートファイルURLを追加する。
ただし、rootユーザーのみ実行・書き込み可能な状態で追加されるため、必要に応じて別途パーミッションを変更する必要がある。
COPY
ホスト側からコンテナへファイルやディレクトリをコピーする。
VOLUME
ボリュームのマウントを行う。
USER
実行ユーザーを指定する。
WORKDIR
各種命令を実行する際の作業ディレクトリ(カレントディレクトリ)を指定する。
ARG
--build-arg
フラグで渡すことが出来る変数を定義する。
ONBUILD
作成するイメージが、別のビルドのベースイメージとして使用されるときに実行される命令を追加する。
STOPSIGNAL
終了時にコンテナに送るシグナルを指定できる。
HEALTHCHECK
コンテナが動作しているかどうかを確認するテストを組み込める。
引数の指定によって30秒に1回動作確認などが出来る。
SHELL
使用するシェルを指定出来る。
おわりに
実際使っていない命令が半分以上あり、理解不十分
これからBest Practicesも読みつつ、人の書いたDockerfileを読みつつで理解を深めていこうと思います。
Dockerfile Best Practices
参考にさせて頂いたサイト(いつもありがとうございます)
【入門】Dockerfileの基本的な書き方 | レコチョクのエンジニアブログ
| Docker Documentation
docker CMD とENTRYPOINT の違いを試してみた - Qiita