Dockerfile 詳解:RUN, CMD, COPY, ADD コマンド

June 14, 2023

top画像

はじめに

Docker は、ソフトウェアのパッケージ化と配布を容易にするためのオープンソースプラットフォームです。

Dockerfile は、Docker イメージを作成するための設定ファイルであり、Dockerfile 内に記述された命令に従って Docker イメージが生成されます。

この記事では、Dockerfile 内で使われる主要な命令、特に RUN, CMD, COPY, ADD コマンドに焦点を当て、それぞれの詳細な使い方とベストプラクティスについて解説します。

RUN コマンド

RUN コマンドは、イメージのビルド時に実行される命令を指定します。この命令は新しいレイヤ上で実行され、その結果はイメージの一部として保存されます。主に、ソフトウェアのインストールや環境設定などに使用されます。

例えば、以下の Dockerfile では、Ubuntu イメージ上で Python と pip をインストールしています。

FROM ubuntu:18.04
RUN apt-get update && apt-get install -y python3 python3-pip

CMD コマンド

CMD コマンドは、コンテナ起動時に実行されるデフォルトのコマンドを指定します。Dockerfile 内で一度だけ使用することができ、複数の CMD コマンドがある場合は最後のものが有効になります。

なお、docker run の際にコマンドを指定した場合、そのコマンドが CMD で指定したコマンドを上書きします。

例えば、以下の Dockerfile では、コンテナ起動時に Python のインタラクティブシェルを開始します。

FROM python:3.7
CMD ["python3"]

COPY コマンド

COPY コマンドは、ホストのファイルやディレクトリを新しいレイヤ上のコンテナのファイルシステムにコピーします。このコマンドは主に、ローカルのソースコードやリソースをイメージに追加するために使用されます。

例えば、以下の Dockerfile では、現在のディレクトリの全てのファイルをコンテナの/app ディレクトリにコピーしています。

FROM python:3.7
COPY . /app

ADD コマンド

ADD コマンドもホストのファイルやディレクトリをコンテナのファイルシステムにコピーしますが、以下の特徴を持ちます。

  • URL を指定すると、その URL の内容をダウンロードしてコンテナにコピーします。
  • ローカルの tar ファイルを指定すると、そのファイルを解凍してコンテナにコピーします。

しかし、これらの特性は明確なユースケースがない限りは推奨されません。これらの機能が必要な場合でも、RUN コマンドと組み合わせて curl や tar コマンドを使った方が明示的であり、その結果のイメージも理解しやすくなります。

一般的に、ファイルやディレクトリのコピーには COPY コマンドの使用が推奨されます。

Dockerfile の具体的な使用例

それでは、これまでに説明したすべてのコマンドを組み合わせて、具体的な Dockerfile の例を見てみましょう。以下の Dockerfile は、Python の Flask アプリケーションを Docker で実行するためのものです。

# ベースとなるイメージを指定
FROM python:3.7

# アプリケーションの依存関係を満たすためのパッケージをインストール
RUN apt-get update && apt-get install -y \
    build-essential \
    libssl-dev \
    libffi-dev \
    python3-dev

# ホストのカレントディレクトリのすべてのファイルをコンテナの/appディレクトリにコピー
COPY . /app

# コンテナ内で作業するディレクトリを/appに設定
WORKDIR /app

# Pythonの依存関係をインストール
RUN pip install --no-cache-dir -r requirements.txt

# ポート5000を開放
EXPOSE 5000

# コンテナを起動した際にFlaskアプリケーションを実行
CMD ["flask", "run", "--host=0.0.0.0"]

この Dockerfile では、以下の手順で Flask アプリケーションを Docker 上で実行します。

  1. FROMコマンドで Python 3.7 のベースイメージを使用します。
  2. RUNコマンドで必要なパッケージをインストールします。
  3. COPYコマンドでホストマシンの現在のディレクトリのファイルをすべて/app ディレクトリにコピーします。
  4. WORKDIRコマンドでコンテナ内の作業ディレクトリを/app に設定します。
  5. 別のRUNコマンドで Python の依存関係をインストールします。requirements.txt ファイルは COPY コマンドでコンテナにコピーされます。
  6. EXPOSEコマンドでポート 5000 を開放します。Flask アプリケーションはデフォルトでこのポートを使用します。
  7. 最後に、CMDコマンドでコンテナを起動した際に Flask アプリケーションを実行します。

これにより、ホストマシンの環境に影響を与えずに Flask アプリケーションを実行することができます。また、この Dockerfile とアプリケーションを他の開発者と共有することで、彼らも同じ環境でアプリケーションを実行することができます。

以上が、RUN, CMD, COPY, ADD コマンドを組み合わせて使用する具体的な Dockerfile の例です。各コマンドの特性と使用方法を理解し、それを基に自分のニーズに合った Dockerfile を作成することで、効率的な開発環境を構築することができます。

まとめ

Dockerfile 内の RUN, CMD, COPY, ADD コマンドは、Docker イメージの作成とコンテナの実行に必要な設定を行うための重要な要素です。

それぞれのコマンドの正確な使い方を理解し、ベストプラクティスに従って使用することで、効率的な Docker イメージを作成することができます。


Profile picture

Written by Mittsu
ベンチャー企業のしがないエンジニア。趣味はサッカーとTCG.

© 2024