📋 このステップで学ぶこと
- Dockerfileとは何か、なぜ必要か
- FROM命令(ベースイメージ指定)
- RUN命令(ビルド時のコマンド実行)
- COPY / ADD命令(ファイルのコピー)
- WORKDIR命令(作業ディレクトリ設定)
- CMD / ENTRYPOINT命令(起動コマンド)
- ENV / ARG / EXPOSE命令
- docker buildコマンドとタグ付け
- レイヤーとキャッシュの基本
📝 1. Dockerfileとは
1-1. Dockerfileの概要
Dockerfileは、Dockerイメージの作り方を記述したテキストファイルです。
このファイルをもとに、Dockerが自動的にイメージを作成します。
📚 料理のレシピで例えると…
Dockerfileは「レシピ」のようなものです。
材料(FROM):ベースとなるイメージ
下準備(RUN):パッケージのインストールなど
具材を入れる(COPY):アプリケーションのファイル
調理方法(CMD):起動時に実行するコマンド
このレシピ通りに作れば、いつでも同じ料理(イメージ)ができます。
1-2. イメージ作成の流れ
【Dockerfileからイメージを作成する流れ】
1. Dockerfileを作成
┌────────────────────────┐
│ FROM python:3.10 │
│ WORKDIR /app │
│ COPY . . │
│ RUN pip install -r … │
│ CMD [“python”, “app”] │
└────────────────────────┘
│
▼
2. docker build コマンドを実行
$ docker build -t my-app:1.0 .
│
▼
3. Dockerがイメージを自動作成
┌────────────────────────┐
│ Dockerイメージ │
│ my-app:1.0 │
└────────────────────────┘
│
▼
4. docker run でコンテナ起動
$ docker run my-app:1.0
1-3. Dockerfileの基本例
# これがDockerfile(ファイル名は「Dockerfile」)
FROM ubuntu:22.04
RUN apt-get update && apt-get install -y nginx
COPY index.html /var/www/html/
CMD [“nginx”, “-g”, “daemon off;”]
📝 各行の意味
FROM ubuntu:22.04 :Ubuntu 22.04をベースにする
RUN apt-get ... :Nginxをインストール
COPY index.html ... :HTMLファイルをコピー
CMD ["nginx", ...] :Nginxを起動
1-4. Dockerfileを使うメリット
| メリット |
説明 |
| 再現性 |
同じDockerfileから、いつでも同じイメージを作成できる。 |
| バージョン管理 |
Gitで履歴管理でき、変更履歴を追跡できる。 |
| 共有 |
チームメンバー全員が同じ環境を構築できる。 |
| 自動化 |
CI/CDパイプラインで自動ビルドできる。 |
| ドキュメント |
環境構築手順がコードとして残る。 |
🏗️ 2. FROM命令 – ベースイメージを指定
2-1. FROM命令とは
FROMは、どのイメージを土台(ベース)にするかを指定する命令です。
Dockerfileの最初の命令として記述します(ARGを除く)。
# 基本的な書き方
FROM イメージ名:タグ
# 例
FROM ubuntu:22.04
FROM python:3.10
FROM node:18-alpine
FROM nginx:latest
📝 コマンドの意味
FROM :ベースイメージを指定する命令
イメージ名 :Docker Hubのイメージ名
:タグ :バージョンを指定(省略すると latest)
2-2. よく使われるベースイメージ
| カテゴリ |
イメージ |
特徴 |
| 汎用OS |
ubuntu:22.04
debian:bookworm
alpine:3.18 |
Ubuntuは使いやすい。Alpineは軽量(約5MB)。 |
| Python |
python:3.10
python:3.10-slim
python:3.10-alpine |
slimは軽量版。alpineはさらに軽量。 |
| Node.js |
node:18
node:18-slim
node:18-alpine |
フロントエンド開発に使用。 |
| Java |
openjdk:17
eclipse-temurin:17 |
Java実行環境。 |
| Webサーバー |
nginx:latest
httpd:latest |
静的サイトのホスティングに。 |
2-3. タグの選び方
【タグの種類と意味】
python:3.10 ← フルバージョン(大きい、全機能)
python:3.10-slim ← 軽量版(小さい、基本機能のみ)
python:3.10-alpine ← 超軽量版(最小限、互換性注意)
python:3.10-bookworm ← Debianベース、バージョン固定
python:latest ← 最新版(バージョン変わる可能性)
【サイズ比較の例】
python:3.10 約 900MB
python:3.10-slim 約 150MB
python:3.10-alpine 約 50MB
💡 ベースイメージの選び方
- 開発環境:フルバージョン(python:3.10)が使いやすい
- 本番環境:slim版でサイズ削減
- 本番(上級者):alpine版で最小化(互換性に注意)
- 避けるべき:latestタグ(バージョンが変わる可能性)
🔧 3. RUN命令 – ビルド時にコマンドを実行
3-1. RUN命令とは
RUNは、イメージのビルド時にコマンドを実行する命令です。
パッケージのインストールやファイルの作成などに使います。
# 基本的な書き方
RUN コマンド
# 例:パッケージをインストール
RUN apt-get update && apt-get install -y curl
📝 コマンドの意味
RUN :ビルド時にシェルコマンドを実行
- 実行結果はイメージに保存される
- コンテナ起動時ではなく、ビルド時に実行される
3-2. よく使うRUNコマンド
# Ubuntu/Debian系:パッケージインストール
RUN apt-get update && apt-get install -y \
curl \
wget \
vim
# Alpine系:パッケージインストール
RUN apk add –no-cache curl wget
# Python:ライブラリインストール
RUN pip install pandas numpy
# Node.js:パッケージインストール
RUN npm install express
# ディレクトリ作成
RUN mkdir -p /app/data
# 権限変更
RUN chmod +x /app/start.sh
3-3. RUN命令のベストプラクティス
✅ 良い例:複数のコマンドを1つのRUNにまとめる
# 良い例
RUN apt-get update && \
apt-get install -y curl wget vim && \
apt-get clean && \
rm -rf /var/lib/apt/lists/*
メリット:レイヤーが1つだけ → イメージサイズが小さい
❌ 悪い例:RUNを分けすぎ
# 悪い例
RUN apt-get update
RUN apt-get install -y curl
RUN apt-get install -y wget
RUN apt-get install -y vim
問題:レイヤーが4つも作られる → イメージサイズが大きい
3-4. キャッシュを削除してサイズ削減
# Ubuntu/Debian:キャッシュを削除
RUN apt-get update && \
apt-get install -y curl && \
apt-get clean && \
rm -rf /var/lib/apt/lists/*
# Alpine:–no-cache オプションでキャッシュを作らない
RUN apk add –no-cache curl
# pip:キャッシュを使わない
RUN pip install –no-cache-dir pandas numpy
📦 4. COPY / ADD命令 – ファイルをコピー
4-1. COPY命令とは
COPYは、ホストのファイルやディレクトリをイメージ内にコピーする命令です。
# 基本的な書き方
COPY ホストのパス イメージ内のパス
# 例
COPY index.html /var/www/html/
COPY app.py /app/
COPY src/ /app/src/
📝 コマンドの意味
COPY :ファイルをイメージにコピー
- ホストのパスはビルドコンテキストからの相対パス
- イメージ内のパスは絶対パスで指定
4-2. COPYの使用例
# 1つのファイルをコピー
COPY index.html /usr/share/nginx/html/
# ディレクトリごとコピー
COPY src/ /app/src/
# 複数のファイルをコピー
COPY file1.txt file2.txt /app/
# ワイルドカードを使用
COPY *.py /app/
# カレントディレクトリの全ファイルをコピー
COPY . /app/
4-3. COPYとADDの違い
| 命令 |
特徴 |
| COPY |
シンプルにファイルをコピー。推奨。動作が明確で予測可能。 |
| ADD |
COPYと同じ機能 + 追加機能(tarファイルの自動展開、URLからダウンロード)。特別な理由がない限りCOPYを使う。 |
4-4. .dockerignoreファイル
COPY . /app/で全ファイルをコピーする際、
不要なファイルを除外するために.dockerignoreファイルを作成します。
# .dockerignore(Dockerfileと同じディレクトリに配置)
.git
.gitignore
README.md
Dockerfile
docker-compose.yml
# Python
*.pyc
__pycache__
.venv
venv
# Node.js
node_modules
# IDE
.vscode
.idea
# OS
.DS_Store
Thumbs.db
💡 .dockerignoreの重要性
- ビルド高速化:不要なファイルを送信しない
- イメージサイズ削減:node_modulesなどを除外
- セキュリティ:.envなどの機密情報を除外
📁 5. WORKDIR命令 – 作業ディレクトリを設定
5-1. WORKDIR命令とは
WORKDIRは、以降の命令(RUN、CMD、COPY等)の作業ディレクトリを設定します。
# 基本的な書き方
WORKDIR /path/to/directory
# 例
WORKDIR /app
WORKDIR /var/www/html
📝 コマンドの意味
WORKDIR :作業ディレクトリを設定
- ディレクトリが存在しない場合は自動作成
- 以降のRUN、CMD、COPY、ENTRYPOINTの基準ディレクトリになる
docker execで入ったときの初期ディレクトリになる
5-2. WORKDIRの効果
❌ WORKDIRを使わない場合
FROM ubuntu:22.04
RUN cd /app && echo “test” > file.txt
RUN cat /app/file.txt # これは動く
RUN cat file.txt # エラー!/app にいない
各RUNは独立して実行されるため、cdの効果は持続しません。
✅ WORKDIRを使う場合
FROM ubuntu:22.04
WORKDIR /app
RUN echo “test” > file.txt
RUN cat file.txt # 成功!/app にいる
COPY . . # /app にコピーされる
WORKDIRで設定したディレクトリは、以降の全ての命令で有効です。
🚀 6. CMD / ENTRYPOINT命令 – 起動コマンド
6-1. CMD命令とは
CMDは、コンテナ起動時に実行するデフォルトのコマンドを指定します。
# exec形式(推奨)
CMD [“実行ファイル”, “引数1”, “引数2”]
# 例
CMD [“nginx”, “-g”, “daemon off;”]
CMD [“python”, “app.py”]
CMD [“node”, “server.js”]
📝 コマンドの意味
CMD :デフォルトの起動コマンドを指定
docker run時にコマンドを指定すると上書きされる
- Dockerfileに1つだけ記述(複数あると最後の1つのみ有効)
6-2. CMDの書き方(2種類)
# 1. exec形式(推奨)- JSONの配列形式
CMD [“python”, “app.py”]
# 2. shell形式 – シェル経由で実行
CMD python app.py
💡 exec形式を推奨する理由
- シグナル(SIGTERM等)が正しくプロセスに届く
- シェルを経由しないため効率的
- 意図した通りにコマンドが実行される
6-3. CMDの上書き
# Dockerfile
FROM python:3.10
WORKDIR /app
COPY app.py .
CMD [“python”, “app.py”]
# 通常の起動(CMDが実行される)
docker run my-app
# → python app.py が実行される
# コマンドを上書きして起動
docker run my-app python other.py
# → python other.py が実行される
# シェルを起動(デバッグ用)
docker run -it my-app bash
# → bash が実行される
6-4. ENTRYPOINT命令
ENTRYPOINTは、コンテナ起動時に必ず実行されるコマンドを指定します。
# ENTRYPOINT の基本
ENTRYPOINT [“実行ファイル”]
# CMDと組み合わせ(CMDがENTRYPOINTの引数になる)
ENTRYPOINT [“python”]
CMD [“app.py”]
# → python app.py が実行される
6-5. CMDとENTRYPOINTの違い
| 項目 |
CMD |
ENTRYPOINT |
| 役割 |
デフォルトコマンド |
必ず実行されるコマンド |
| 上書き |
docker run時に上書き可能 |
–entrypointオプションでのみ上書き可能 |
| 組み合わせ |
単独で使用、またはENTRYPOINTの引数として |
CMDを引数として受け取る |
| 用途 |
一般的なアプリケーション |
CLIツール、固定のエントリポイント |
📝 実践例:ENTRYPOINTとCMDの組み合わせ
# Dockerfile
FROM python:3.10-slim
WORKDIR /app
COPY . .
ENTRYPOINT [“python”]
CMD [“app.py”]
# 使い方
docker run my-app # → python app.py
docker run my-app test.py # → python test.py
docker run my-app -c “print(1)” # → python -c “print(1)”
⚙️ 7. ENV / ARG / EXPOSE命令
7-1. ENV命令 – 環境変数を設定
ENVは、コンテナ内で使用する環境変数を設定します。
# 基本的な書き方
ENV 変数名=値
# 例
ENV APP_ENV=production
ENV DB_HOST=localhost
ENV DB_PORT=5432
# 複数の環境変数を一度に設定
ENV APP_ENV=production \
DB_HOST=localhost \
DB_PORT=5432
📝 ENVの特徴
- ビルド時とコンテナ実行時の両方で使用可能
- イメージに永続的に保存される
docker run -eで上書き可能
7-2. ARG命令 – ビルド時の変数
ARGは、ビルド時のみ使用できる変数を定義します。
# 基本的な書き方
ARG 変数名=デフォルト値
# 例
ARG VERSION=1.0
ARG BASE_IMAGE=python:3.10
# FROMの前で使う場合
ARG BASE_IMAGE=python:3.10
FROM ${BASE_IMAGE}
# ビルド時に値を渡す
docker build –build-arg VERSION=2.0 -t my-app .
7-3. ENVとARGの違い
| 項目 |
ENV |
ARG |
| 使用タイミング |
ビルド時 + 実行時 |
ビルド時のみ |
| イメージへの保存 |
保存される |
保存されない |
| 上書き方法 |
docker run -e |
docker build --build-arg |
| 用途 |
アプリの設定値 |
ビルド時のバージョン指定など |
7-4. EXPOSE命令 – ポートを公開
EXPOSEは、コンテナが使用するポート番号を明示します。
# 基本的な書き方
EXPOSE ポート番号
# 例
EXPOSE 80
EXPOSE 443
EXPOSE 3000
⚠️ EXPOSEの注意点
EXPOSEはドキュメントとしての役割がメインです。
実際にポートを公開するには、docker run -pが必要です。
# EXPOSEだけでは外部からアクセスできない
docker run my-app
# -p オプションで実際に公開
docker run -p 8080:80 my-app
🔨 8. docker build – イメージをビルド
8-1. docker buildの基本
docker build -t my-app:1.0 .
📝 コマンドの意味
docker build :イメージをビルドするコマンド
-t my-app:1.0 :イメージ名とタグを指定
. :ビルドコンテキスト(Dockerfileのあるディレクトリ)
8-2. ビルドの実行例
# 1. Dockerfileを作成
cat > Dockerfile << ‘EOF’
FROM nginx:latest
COPY index.html /usr/share/nginx/html/
EXPOSE 80
CMD [“nginx”, “-g”, “daemon off;”]
EOF
# 2. index.htmlを作成
echo ‘<h1>Hello Docker!</h1>’ > index.html
# 3. イメージをビルド
docker build -t my-nginx:1.0 .
[+] Building 2.1s (7/7) FINISHED
=> [internal] load build definition from Dockerfile
=> [internal] load .dockerignore
=> [internal] load metadata for docker.io/library/nginx:latest
=> [1/2] FROM docker.io/library/nginx:latest
=> [2/2] COPY index.html /usr/share/nginx/html/
=> exporting to image
=> => naming to docker.io/library/my-nginx:1.0
# 4. ビルドしたイメージを確認
docker images | grep my-nginx
# 5. コンテナを起動
docker run -d -p 8080:80 my-nginx:1.0
# 6. ブラウザで確認
# http://localhost:8080
8-3. よく使うオプション
| オプション |
説明 |
-t, --tag |
イメージ名とタグを指定。例:-t my-app:1.0 |
-f, --file |
Dockerfileのパスを指定。例:-f Dockerfile.prod |
--no-cache |
キャッシュを使わずにビルド。完全に新規ビルド。 |
--build-arg |
ARGで定義した変数に値を渡す。例:--build-arg VERSION=2.0 |
--target |
マルチステージビルドで特定のステージまでビルド。 |
8-4. タグ付けのベストプラクティス
# 複数のタグをつける
docker build -t my-app:1.0.0 -t my-app:1.0 -t my-app:latest .
# セマンティックバージョニング
docker build -t my-app:1.0.0 . # パッチバージョン
docker build -t my-app:1.0 . # マイナーバージョン
docker build -t my-app:1 . # メジャーバージョン
# 環境ごとにタグを分ける
docker build -t my-app:dev -f Dockerfile.dev .
docker build -t my-app:prod -f Dockerfile.prod .
📚 9. レイヤーとキャッシュの基本
9-1. イメージのレイヤー構造
Dockerイメージは複数のレイヤーで構成されています。
Dockerfileの各命令(FROM、RUN、COPY等)が1つのレイヤーを作成します。
【レイヤー構造の例】
Dockerfile レイヤー
┌────────────────────────┐
│ FROM python:3.10 │ ──▶ Layer 1: ベースイメージ
├────────────────────────┤
│ WORKDIR /app │ ──▶ Layer 2: 作業ディレクトリ設定
├────────────────────────┤
│ COPY requirements.txt .│ ──▶ Layer 3: requirements.txt
├────────────────────────┤
│ RUN pip install -r … │ ──▶ Layer 4: ライブラリインストール
├────────────────────────┤
│ COPY . . │ ──▶ Layer 5: アプリケーションコード
├────────────────────────┤
│ CMD [“python”, “app”] │ ──▶ Layer 6: 起動コマンド
└────────────────────────┘
各レイヤーは読み取り専用で、積み重なって1つのイメージを構成
9-2. ビルドキャッシュの仕組み
Dockerは、変更のないレイヤーをキャッシュから再利用します。
これにより、2回目以降のビルドが高速になります。
【キャッシュの動作】
1回目のビルド(全てのレイヤーを新規作成)
Layer 1: FROM python:3.10 [新規作成]
Layer 2: WORKDIR /app [新規作成]
Layer 3: COPY requirements.txt [新規作成]
Layer 4: RUN pip install [新規作成] ← 時間がかかる
Layer 5: COPY . . [新規作成]
2回目のビルド(app.pyだけ変更した場合)
Layer 1: FROM python:3.10 [キャッシュ使用] ✓
Layer 2: WORKDIR /app [キャッシュ使用] ✓
Layer 3: COPY requirements.txt [キャッシュ使用] ✓
Layer 4: RUN pip install [キャッシュ使用] ✓ ← スキップ!
Layer 5: COPY . . [新規作成] ← ここだけ再実行
9-3. キャッシュを活用するコツ
✅ 良い例:変更頻度の低いものを先に
# 良い例
FROM python:3.10
WORKDIR /app
# 依存関係ファイルを先にコピー(変更頻度:低)
COPY requirements.txt .
RUN pip install -r requirements.txt
# アプリケーションコードを後でコピー(変更頻度:高)
COPY . .
CMD [“python”, “app.py”]
❌ 悪い例:全ファイルを先にコピー
# 悪い例
FROM python:3.10
WORKDIR /app
# 全ファイルを先にコピー
COPY . .
# コードを少し変更するたびにpip installが再実行される
RUN pip install -r requirements.txt
CMD [“python”, “app.py”]
💡 キャッシュ活用のポイント
- 変更頻度の低いものを上に配置
- 変更頻度の高いものを下に配置
- 依存関係のインストールはアプリコードより先に
💪 10. 練習問題
練習問題 1
基礎
Hello Worldを表示するDockerfileを作成してください
Ubuntuベースで、起動時に「Hello Docker!」と表示するイメージを作成してください。
【解答】
# Dockerfileを作成
cat > Dockerfile << ‘EOF’
FROM ubuntu:22.04
CMD [“echo”, “Hello Docker!”]
EOF
# ビルド
docker build -t hello:1.0 .
# 実行
docker run –rm hello:1.0
# 出力:Hello Docker!
# 後片付け
docker rmi hello:1.0
rm Dockerfile
練習問題 2
基礎
カスタムNginxイメージを作成してください
index.htmlを作成し、Nginxイメージにコピーして、カスタムWebページを表示してください。
【解答】
# index.html作成
cat > index.html << ‘EOF’
<!DOCTYPE html>
<html>
<head><title>My Custom Nginx</title></head>
<body><h1>Welcome to My Custom Nginx!</h1></body>
</html>
EOF
# Dockerfile作成
cat > Dockerfile << ‘EOF’
FROM nginx:latest
COPY index.html /usr/share/nginx/html/
EXPOSE 80
EOF
# ビルド
docker build -t my-nginx:custom .
# 実行
docker run -d -p 8080:80 –name web my-nginx:custom
# ブラウザで確認:http://localhost:8080
# 後片付け
docker stop web
docker rm web
docker rmi my-nginx:custom
rm Dockerfile index.html
練習問題 3
基礎
WORKDIRを使ってPythonスクリプトをコンテナ化してください
WORKDIRで作業ディレクトリを設定し、Pythonスクリプトを実行してください。
【解答】
# hello.py作成
cat > hello.py << ‘EOF’
import os
print(f”Current directory: {os.getcwd()}”)
print(“Hello from Python in Docker!”)
for i in range(5):
print(f”Count: {i}”)
EOF
# Dockerfile作成
cat > Dockerfile << ‘EOF’
FROM python:3.10-slim
WORKDIR /app
COPY hello.py .
CMD [“python”, “hello.py”]
EOF
# ビルド
docker build -t python-hello:1.0 .
# 実行
docker run –rm python-hello:1.0
# 出力:Current directory: /app
# Hello from Python in Docker!
# Count: 0 … Count: 4
# 後片付け
docker rmi python-hello:1.0
rm Dockerfile hello.py
練習問題 4
応用
ENV命令で環境変数を設定してください
環境変数APP_NAMEとAPP_VERSIONを設定し、Pythonスクリプトで表示してください。
【解答】
# app.py作成
cat > app.py << ‘EOF’
import os
app_name = os.environ.get(‘APP_NAME’, ‘Unknown’)
app_version = os.environ.get(‘APP_VERSION’, ‘0.0.0’)
print(f”Application: {app_name}”)
print(f”Version: {app_version}”)
EOF
# Dockerfile作成
cat > Dockerfile << ‘EOF’
FROM python:3.10-slim
WORKDIR /app
ENV APP_NAME=MyApp \
APP_VERSION=1.0.0
COPY app.py .
CMD [“python”, “app.py”]
EOF
# ビルド
docker build -t env-app:1.0 .
# 実行
docker run –rm env-app:1.0
# 出力:Application: MyApp
# Version: 1.0.0
# 環境変数を上書きして実行
docker run –rm -e APP_VERSION=2.0.0 env-app:1.0
# 出力:Application: MyApp
# Version: 2.0.0
# 後片付け
docker rmi env-app:1.0
rm Dockerfile app.py
練習問題 5
応用
RUNでパッケージをインストールしてください
curlをインストールし、起動時にGoogle.comにアクセスするイメージを作成してください。
【解答】
# Dockerfile作成
cat > Dockerfile << ‘EOF’
FROM ubuntu:22.04
RUN apt-get update && \
apt-get install -y curl && \
apt-get clean && \
rm -rf /var/lib/apt/lists/*
CMD [“curl”, “-I”, “https://www.google.com”]
EOF
# ビルド
docker build -t curl-app:1.0 .
# 実行
docker run –rm curl-app:1.0
# 出力:HTTP/2 200 …
# 後片付け
docker rmi curl-app:1.0
rm Dockerfile
練習問題 6
応用
.dockerignoreを作成してください
不要なファイルを除外する.dockerignoreを作成し、効果を確認してください。
【解答】
# テスト用ファイルを作成
mkdir test-project && cd test-project
echo “print(‘Hello’)” > app.py
echo “# README” > README.md
echo “SECRET=password” > .env
mkdir -p .git
echo “git data” > .git/config
# Dockerfile作成
cat > Dockerfile << ‘EOF’
FROM python:3.10-slim
WORKDIR /app
COPY . .
RUN ls -la
CMD [“python”, “app.py”]
EOF
# .dockerignore なしでビルド
docker build -t test:no-ignore .
# → 全てのファイルがコピーされる
# .dockerignore作成
cat > .dockerignore << ‘EOF’
.git
.env
README.md
Dockerfile
.dockerignore
EOF
# .dockerignore ありでビルド
docker build -t test:with-ignore .
# → .git, .env, README.md は除外される
# 後片付け
cd ..
rm -rf test-project
docker rmi test:no-ignore test:with-ignore
練習問題 7
発展
ENTRYPOINTとCMDを組み合わせてください
ENTRYPOINTでpythonを固定し、CMDでデフォルトスクリプトを指定してください。実行時に別のスクリプトを指定できることも確認してください。
【解答】
# スクリプト作成
cat > app.py << ‘EOF’
print(“This is app.py – the default script”)
EOF
cat > other.py << ‘EOF’
print(“This is other.py – an alternative script”)
EOF
# Dockerfile作成
cat > Dockerfile << ‘EOF’
FROM python:3.10-slim
WORKDIR /app
COPY *.py .
ENTRYPOINT [“python”]
CMD [“app.py”]
EOF
# ビルド
docker build -t entrypoint-demo:1.0 .
# デフォルト(app.py)を実行
docker run –rm entrypoint-demo:1.0
# 出力:This is app.py – the default script
# other.pyを実行
docker run –rm entrypoint-demo:1.0 other.py
# 出力:This is other.py – an alternative script
# Pythonの対話モード
docker run –rm -it entrypoint-demo:1.0 -c “print(1+1)”
# 出力:2
# 後片付け
docker rmi entrypoint-demo:1.0
rm Dockerfile app.py other.py
練習問題 8
発展
ARGを使ってビルド時にバージョンを指定してください
ARGでVERSIONを定義し、ビルド時に異なるバージョンを指定できるようにしてください。
【解答】
# app.py作成
cat > app.py << ‘EOF’
import os
version = os.environ.get(‘APP_VERSION’, ‘unknown’)
print(f”Application Version: {version}”)
EOF
# Dockerfile作成
cat > Dockerfile << ‘EOF’
FROM python:3.10-slim
# ビルド時の変数
ARG VERSION=1.0.0
# ARGの値をENVに設定(実行時にも使えるように)
ENV APP_VERSION=${VERSION}
WORKDIR /app
COPY app.py .
CMD [“python”, “app.py”]
EOF
# デフォルトバージョンでビルド
docker build -t version-app:1.0 .
docker run –rm version-app:1.0
# 出力:Application Version: 1.0.0
# バージョンを指定してビルド
docker build –build-arg VERSION=2.5.0 -t version-app:2.5 .
docker run –rm version-app:2.5
# 出力:Application Version: 2.5.0
# 後片付け
docker rmi version-app:1.0 version-app:2.5
rm Dockerfile app.py
📝 STEP 11 のまとめ
✅ このステップで学んだこと
- Dockerfile:イメージの作り方を記述したファイル
- FROM:ベースイメージを指定
- RUN:ビルド時にコマンドを実行
- COPY / ADD:ファイルをイメージにコピー
- WORKDIR:作業ディレクトリを設定
- CMD / ENTRYPOINT:起動コマンドを指定
- ENV / ARG:環境変数とビルド変数
- EXPOSE:ポートを明示
- docker build:Dockerfileからイメージをビルド
- レイヤーとキャッシュ:効率的なビルドの仕組み
📊 Dockerfile命令一覧
| 命令 |
機能 |
FROM |
ベースイメージを指定 |
RUN |
ビルド時にコマンドを実行 |
COPY |
ファイルをコピー(推奨) |
ADD |
ファイルをコピー(tar展開、URL対応) |
WORKDIR |
作業ディレクトリを設定 |
CMD |
デフォルトの起動コマンド |
ENTRYPOINT |
固定の起動コマンド |
ENV |
環境変数を設定 |
ARG |
ビルド時の変数を定義 |
EXPOSE |
ポートを明示(ドキュメント用) |
💡 重要ポイント
Dockerfileを書けるようになると、自分専用のイメージが作れます。
アプリケーションをどこでも同じ環境で動かせるようになります。
DockerfileはGitで管理しましょう。
チーム全員が同じ環境を使えるようになります。
キャッシュを活用して、効率的にビルドしましょう。
変更頻度の低いものを上に、高いものを下に配置します。
🎯 次のステップの予告
次のSTEP 12では、「Pythonデータ処理スクリプトのコンテナ化」を学びます。
- requirements.txtの管理
- 環境変数の設定
- データファイルのマウント
- 実践的なPandasスクリプトのDocker化
データエンジニアリングの実践に向けて、準備を進めましょう!