こんにちはフロントエンドエンジニアのまさにょんです!
今回は、Dockerfileの作り方と命令文(コマンド)の一覧・意味(FROM, RUN, WORKDIRなど)についてまとめて解説していきます。
目次
Dockerfileの作り方と命令文(コマンド)の一覧・意味まとめ
前提: Dockerでの環境構築のフロー
Dockerでは、Dockerfile => Docker Image => Docker Container という順で環境が作られます。
DockerfileをベースにImageが作成されて、ImageをベースにContainerが作成されます。
Dockerfileとは?Dockerfileの命令文(コマンド)とは?
Dockerfile とは、Docker Image を作成するための設定ファイルです。
また、Dockerfileには、命令文(コマンド)と呼ばれるものを記述して、
Dockerfileには、ベースとなるDocker Imageの情報や、実行したいコマンド、作業ディレクトリの設定、Container に含めたいファイル情報等を記載します。
Dockerfileを作成していれば、Dockerfileをbuildするだけで、Docker Imageが作成できます。
Docker Imageとは、Docker Containerの実行に必要な概念としてのパッケージであり、ファイルやメタ情報の集合体であることがポイントです。
つまり、Dockerfileは、基本的な機能を備えたImageをカスタマイズして、要件にあったContainerを作るためのファイルなのです。
Dockerfileの命令文の一覧・意味
Dockerfileでよく使用される命令文を一覧にしてまとめました。
各、命令文(コマンド)には簡単な説明を付けています。参考にしてください。
命令文(コマンド) | 説明 |
---|---|
FROM | ・ベースとなるDocker Imageを指定します。 ・だいたいは公式にリリースされている Image から引っ張ってくることが多いです。 |
RUN | ・Docker ImageをDockerfileからBuild(作成)する際に実行されるコマンドになります。 ・RUNコマンドは、FROMで指定したベース Image に対して追加で行う処理を表します。 |
WORKDIR | ・Container内の作業ディレクトリを指定(存在しない場合は新しく作成)するコマンドです。 ・ RUN , CMD , ENTRYPOINT , COPY , ADD コマンドたちはWORKDIR 内で実行されます。・ WORKDIR の指定がない場合は、上記のコマンドたちはルートディレクトリで実行されます。 |
COPY | ・Host側のファイルを Docker Image側の指定したディレクトリにコピーするコマンドです。 |
EXPOSE | ・Container が Listen する Port を指定できます。 ・Docker Composeと合わせて、Dockerfileを使用することが多いので、あまり出番はない。 |
CMD | ・docker run か docker-compose run などで Containerが起動した際に、実行されるコマンドを指定できます。 ・ docker-compose.yml でも、command で同じようにコマンドを指定できます。 |
ENV | ・環境変数(env)を設定することができます。 ・使用するベースImageによって、設定できる環境変数は変わります。 |
ADD | ・Host側のファイルを Docker Image側の指定したディレクトリにコピーするコマンドです。 ・URLからダウンロードしたり、tarファイルを解凍したりすることもできる。 |
特に重要なコマンドについては、この後、別途解説します。
WORKDIRコマンド
DockerfileのWORKDIR
コマンドは、Docker Container 内で実行される作業ディレクトリを指定するための命令です。
つまり、Docker Image内での作業ディレクトリを指定します。
Dockerfileの中で、WORKDIR
命令で作業ディレクトリを指定すると、
その後に実行されるRUN
, CMD
, ENTRYPOINT
, COPY
, ADD
コマンドたちは、WORKDIR
で指定されたディレクトリ内で実行されます。
注意点は、 WORKDIR
コマンドで指定された作業ディレクトリは、Hostマシンのファイルシステム上のディレクトリとは違い、Containerの中にあるディレクトリである点です。
つまり、Docker Containerが実行される際に、WORKDIR
で指定されたディレクトリがContainer内に作成されるのであって、Hostマシンに存在するディレクトリではありません。
なお、WORKDIR
コマンドが指定されていない場合は、Dockerコンテナには作業ディレクトリが存在しないため、
RUN
, CMD
, ENTRYPOINT
, COPY
, ADD
コマンドたちは、Docker Container のルートディレクトリで実行されます。
COPYコマンドとADDコマンドの使い分け方について
Dockerfileには、Docker Imageにファイルをコピーするための2つのコマンド、COPYとADDがあります。
両方とも、Hostマシンのファイルやディレクトリを Docker Container のファイルシステムに新しいファイルをコピーして追加することができます。
ただ、ADDコマンドだけの特徴として、URLやtarファイルを含むさまざまな種類のパスを使用してファイルをコピーすることができます。
つまり、COPY命令は、ファイルシステム上のパスを使用してファイルをコピーするのに対して、
ADD命令は、新しいファイルをコピーする前に、URLからDownloadしたり、ファイルを解凍したりなどの実行をすることができるわけです。
一般的には、ファイルのコピーだけを行う場合はCOPY命令を使用し、
URLからDownloadしたり、ファイルを解凍したりするなどの追加の実行をしてからファイルをコピーしたい場合はADD命令を使用します。
Dockerfileを観て解析するSample: Node環境構築
実際にProjectを作成するために使ったDockerfileの内容を見ていきます。
FROM node:18.16.0-alpine
WORKDIR /usr/src/app
このDockerfileは、Node.jsアプリケーションを実行するためのDockerイメージを作成するためのものであり、
Node.jsのランタイム環境を提供し、/usr/src/app
ディレクトリにアプリケーションファイルをコピーするように指定しています。
FROM
コマンドは、ビルドするDockerイメージのベースとなるイメージを指定しています。WORKDIR
コマンドは、コンテナ内で作業するディレクトリを/usr/src/app
に設定しています。WORKDIR
で指定されたPathは、イメージ内でアプリケーションを実行するためのディレクトリとして使用されます。- 以降のRUNやCOPYコマンドで指定されたファイルやディレクトリは、このディレクトリ内にコピーされるようになります。
上記のNode Containerを構築するためのDockerfileは、React-TypeScriptのAppを開発するために作りました。
Dockerfileを観て解析するSample: Python-Flask環境構築
続いて、先ほどよりも少し複雑なDockerfileを見ていきます。
FROM python:3.8-slim-buster
# Docker Image内で実行される作業ディレクトリ(Path)を指定する: ない場合は作ってくれます。
WORKDIR /usr/src/app
# Flask環境変数: Dockerコンテナ内で、Flaskがアプリケーションを正しく検出し、起動できるようになります。
ENV FLASK_APP=app
# Hostマシンのディレクトリ・ファイル を Container側のPathに COPY(追加)する
COPY ./app ./
# RUNコマンド: Docker Image内で、コマンドを実行する
# pipを最新バージョンに更新する
RUN pip install --upgrade pip
# パッケージをキャッシュせずにインストール & -rオプションで、依存パッケージを一括インストール
RUN pip install --no-cache-dir -r requirements.txt
このDockerfileは、Python-FlaskのアプリケーションをDockerで構築するためのものです。
各コマンドでの実行内容は、次のとおりです。
FROM
コマンドで、Python 3.8を実行するため「python:3.8-slim-buster」をベースとしています。RUN
コマンドで、/app
という名前のディレクトリを作成します。WORKDIR
コマンドで、/app
ディレクトリに移動します。- 以降の命令は、
/app
ディレクトリ内で実行されます。
- 以降の命令は、
COPY
コマンドで、ローカルのrequirements.txt
ファイルを/appディレクトリにコピーします。RUN
コマンドで、pipをアップグレードします。RUN
コマンドで、requirements.txt
ファイルに記載されたパッケージをインストールします。COPY
コマンドで、ローカルのすべてのファイルを/app
ディレクトリにコピーします。EXPOSE
コマンドで、5000番Portでアプリを公開します。CMD
コマンドで、コンテナが起動したときに実行されるデフォルトのコマンドを指定します。- この場合
python app.py
コマンドを実行して、app.py
ファイルを実行するように指定されています。
- この場合
上記のPython-Flask-Containerを構築するためのDockerfileは、BackEndのAPIを開発するために作りました。
関連記事
Dockerの学習・参考書
参考・引用
- 【Docker】Dockerfileとは|書き方・コマンド一覧・イメージ作成手順を徹底解説
- Dockerfile のコマンド一覧
- Docker超入門⑦〜よく使うDockerfileコマンド一覧〜【初心者向け】