いままでDockerを使用したことなかったのですが、最近Dockerを使う機会がありDockerを使用して開発環境を構築したりしたのですが、Dockerはとても便利ですね! そのDockerのインフラの構成をコードで行えるDockerfileの基本的な書き方をまとめておきたいと思います。
Dockerfileの基本構文一覧
Dockerfileを作成するときに用いる命令文の一覧が下記になります。
公式ドキュメント
- FROM : ベースイメージの指定
- RUN : コマンド実行
- CMD : デーモン実行
- LABEL : ラベルの設定
- EXPOSE : ポートのエクスポート
- ENV : 環境変数の設定
- ADD : ファイル / ディレクトリの追加
- COPY : ファイルのコピー
- VOLUME : ボリュームのマウント
- ENTRYPOINT : デーモン実行
- USER : ユーザーの指定
- WORKDIR : 作業ディレクトリの指定
- ONBUILD : ビルド完了後に実行される命令
それぞれのコマンドについて以下に簡単に書いておきます。
Dockerfileコマンドの詳細
FROM : ベースイメージの指定
FROM {イメージ}:{タグ}
、FROM {イメージ}@{ダイジェスト}
Dockerでビルドするベースイメージを指定することができます。 (例)FROM ubuntu:18.04
(タグなどを指定しなければ最新のもの)RUN : コマンド実行
RUN {実行するコマンド}
Dockerイメージを生成するときに実行されます。主に、ソフトウェアなどのインストールなどを行います Shell形式とExec形式の2通りの書き方があります。 (例)Shell形式RUN sudo apt-get install apache
(シェルで実行)
Exec形式RUN ["/bin/bash", "echo 'Hello World!'"]
(直接実行します。環境変数などは利用不可。JSON配列)
この2通りの書き方は他のコマンドにも適用可能CMD : デーモン実行
CMD {実行するコマンド}
CMDはFROMコマンドのイメージで生成したコンテナ内でコマンドを実行します。Dockerfileには1つのCMDのみ記述可能。複数指定した場合は、最後のCMDを実行します。
(例)CMD exec program1
※docker run
コマンドの実行時にコマンドを指定された場合、それが優先されます。LABEL : ラベルの設定
LABEL {key}={value} {key}={value} ...
イメージのラベル情報の設定を行います。
(例)LABEL version="1.0"
EXPOSE : ポートのエクスポート
EXPOSE {port number}
コンテナの公開するポート番号を指定できます。
(例)EXPOSE 80/tcp
ENV : 環境変数の設定
ENV {key} {value}
、ENV {key}={value} ...
コンテナ内での環境変数の設定が可能。
(例)ENV name Ryu
WORKDIR : 作業ディレクトリの指定
WORKDIR {作業用ディレクトリのパス}
RUNやCMDコマンドで指定したコマンドを実行するディレクトリを指定します。ENVコマンドで指定した環境変数の使用も可能。
(例)WORKDIR /home/work
ENV DIRPATH /home WORKDIR $DIRPATH/sample
ADD : ファイル / ディレクトリの追加
ADD {ファイルのパス} {Docker内のファイルのパス}
ADD ["{ファイルのパス}" "{Docker内のファイルのパス}"]
Dockerイメージ内にホストのファイルやディレクトリの追加します。
(例)ADD index.html /home/sample/
ADD index.html sample
(WORKDIR/sampleとなります。)COPY : ファイルのコピー
COPY {ファイルのパス} {Docker内のファイルのパス}
COPY ["{ファイルのパス}" "{Docker内のファイルのパス}"]
Dockerイメージ内にホストのファイルやディレクトリをコピーします。
(例)COPY index.html /home/sample/
COPY index.html sample
(WORKDIR/sampleとなります。)VOLUME : ボリュームのマウント
VOLUME ["{マウントするパス}"]
Dockerイメージのボリュームのマウントする場所を割り当てます。(JSON配列)
(例)VOLUME ["/data"]
ENTRYPOINT : デーモン実行
ENTRYPOINT {実行するコマンド}
ENTRYPOINT ["{実行するコマンド}"]
docker run
コマンドが実行されるときに実行されます。
(例)ENTRYPOINT ["/usr/sbin/apache2ctl", "-D", "FOREGROUND"]
USER : ユーザーの指定
USER {user名 / UID}
Dockerイメージの実行をするユーザーを指定します。
(例)USER Ryu
ONBUILD : ビルド完了後に実行される命令
ONBUILD {実行するコマンド}
Dockerのイメージをビルドするときに実行されます。Dockerfileのイメージをベースイメージとして、他のイメージをビルドスするときに役立ちます。
(例)ONBUILD ADD . /app/src
ONBUILD RUN /usr/local/bin/python-build --dir /app/src
Dockerfileをどこに置くべきか
Dockerfileをdocker build
すると、DockerfileがあるディレクトリやサブディレクトリをDocker daemonに送ります。したがって、ルートディレクトリなどにおいてしまうとすべてのコンテンツを送ってしまいます。
なので、必要ないファイルはDockerfileと同じディレクトリに置かないようにしたり、.dockerignore
ファイルを作成したりする。もしくは、空のディレクトリなどを作成し、そのディレクトリ内に置いたりするのが良いみたいです。