Dockerfileのコマンド比較 # Dockerfile command comparison
DockerfileのCOPYとADDコマンドの違いを日本語で解説
DockerfileにおけるCOPY
とADD
コマンドは、どちらもイメージにファイルをコピーする役割を持ちますが、その動作に違いがあります。
COPYコマンド
- 単純なコピー: ファイルやディレクトリを指定したパスからイメージ内の指定されたパスにコピーします。
- 直接指定: コピー元のパスは直接指定する必要があります。
例:
COPY . /app
ADDコマンド
- 拡張機能:
COPY
の機能に加えて、以下の機能を提供します。- 自動解凍:
tar
,gzip
,bzip2
などの圧縮ファイルの自動解凍。 - URLダウンロード: URLからファイルをダウンロードしてコピー。
- 自動解凍:
ADD https://example.com/myapp.tar.gz /app
要約
- COPY: シンプルなファイルコピー。
- ADD: COPYの機能に加えて、自動解凍とURLダウンロードが可能。
選択基準:
- 単純なコピー:
COPY
を使用。 - 圧縮ファイルの解凍やURLからのダウンロード:
ADD
を使用。
注意:
ADD
の自動解凍機能は便利ですが、セキュリティリスクがある場合があります。信頼できるソースからのファイルのみを使用してください。ADD
のURLダウンロード機能はネットワーク接続が必要となります。
# Dockerfile
# ベースイメージとしてNode.jsの最新バージョンを使用
FROM node:latest
# 現在のディレクトリ内のファイルを/appにコピー
COPY . /app
# パッケージのインストール
WORKDIR /app
RUN npm install
# アプリケーションの起動
CMD ["npm", "start"]
- 解説:
- このDockerfileはNode.jsアプリケーションをビルドし、実行するためのものです。
FROM node:latest
でNode.jsの最新バージョンをベースイメージとして使用します。COPY . /app
で現在のディレクトリ内のすべてのファイルとディレクトリを/app
ディレクトリにコピーします。WORKDIR /app
で作業ディレクトリを/app
に設定します。RUN npm install
でパッケージをインストールします。CMD ["npm", "start"]
でアプリケーションを起動します。
# Dockerfile
# ベースイメージとしてPythonの最新バージョンを使用
FROM python:latest
# requirements.txtからパッケージをインストール
COPY requirements.txt /requirements.txt
RUN pip install -r /requirements.txt
# アプリケーションのコードをダウンロードして解凍
ADD https://example.com/myapp.tar.gz /app
- 解説:
COPY requirements.txt /requirements.txt
でrequirements.txt
ファイルを/requirements.txt
にコピーします。RUN pip install -r /requirements.txt
でrequirements.txt
に指定されたパッケージをインストールします。ADD https://example.com/myapp.tar.gz /app
で指定されたURLからmyapp.tar.gz
ファイルをダウンロードし、/app
ディレクトリに解凍します。
- ADD: 自動解凍やURLダウンロードが可能。
ADD
の自動解凍機能は便利ですが、セキュリティリスクがある場合があります。
マルチステージビルド
- 利点: ファイルのサイズを削減し、ビルド時間を短縮できる。
- 方法:
- 複数のステージを持つDockerfileを作成する。
- 前のステージでビルドされたファイルや成果物を次のステージにコピーする。
- 不要なファイルや中間ファイルをステージ間で削除する。
# Stage 1: ビルドステージ
FROM node:18-alpine as builder
WORKDIR /app
COPY package*.json ./
RUN npm install
# Stage 2: ランタイムステージ
FROM node:18-alpine
WORKDIR /app
COPY --from=builder /app /app
CMD ["npm", "start"]
Docker Compose
- 利点: 複数のサービスを定義し、管理することができる。
- 方法:
- Docker Composeファイルを作成する。
- 各サービスのビルドプロセスを定義する。
- サービス間の依存関係やネットワーク設定を指定する。
version: '3.8'
services:
web:
build: .
volumes:
- ./:/app
ports:
- "3000:3000"
Docker CLIのCOPYコマンド
- 利点: Dockerfileを使用せずに、直接コマンドラインからファイルをコピーできる。
- 方法:
- Dockerイメージを作成し、コンテナを起動する。
docker cp
コマンドを使用してファイルをコンテナにコピーする。
docker cp ./my_file.txt my_container:/app/
ビルドツール(make、Bazelなど)
- 利点: 複雑なビルドプロセスを管理し、再利用できる。
- 方法:
- ビルドツールを使用してビルドプロセスを定義する。
- Dockerイメージを作成する際に、ビルドツールの出力ファイルを使用する。
# Makefile
build:
docker build -t my-image .
run:
docker run -it my-image
docker dockerfile