Dockerfileの作り方と命令文(コマンド)の一覧・意味まとめ(FROM, RUN, WORKDIRなど)

Docker_Dockerfile

こんにちはフロントエンドエンジニアのまさにょんです!

今回は、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を使用することが多いので、あまり出番はない。
CMDdocker rundocker-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 ディレクトリにアプリケーションファイルをコピーするように指定しています。

  1. FROM コマンドは、ビルドするDockerイメージのベースとなるイメージを指定しています。
  2. 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で構築するためのものです。

各コマンドでの実行内容は、次のとおりです。

  1. FROMコマンドで、Python 3.8を実行するため「python:3.8-slim-buster」をベースとしています。
  2. RUN コマンドで、/appという名前のディレクトリを作成します。
  3. WORKDIR コマンドで、/appディレクトリに移動します。
    • 以降の命令は、/appディレクトリ内で実行されます。
  4. COPYコマンドで、ローカルのrequirements.txtファイルを/appディレクトリにコピーします。
  5. RUNコマンドで、pipをアップグレードします。
  6. RUNコマンドで、requirements.txtファイルに記載されたパッケージをインストールします。
  7. COPYコマンドで、ローカルのすべてのファイルを/appディレクトリにコピーします。
  8. EXPOSEコマンドで、5000番Portでアプリを公開します。
  9. CMDコマンドで、コンテナが起動したときに実行されるデフォルトのコマンドを指定します。
    • この場合python app.py コマンドを実行して、app.pyファイルを実行するように指定されています。

上記のPython-Flask-Containerを構築するためのDockerfileは、BackEndのAPIを開発するために作りました。

関連記事

Dockerの学習・参考書

参考・引用

  1. 【Docker】Dockerfileとは|書き方・コマンド一覧・イメージ作成手順を徹底解説
  2. Dockerfile のコマンド一覧
  3. Docker超入門⑦〜よく使うDockerfileコマンド一覧〜【初心者向け】

最近の投稿