STEP 11:Dockerfileの基本構文

🐳 STEP 11: Dockerfileの基本構文

自分でDockerイメージを作成する – FROM、RUN、COPY、CMDの使い方をマスター

📋 このステップで学ぶこと

  • 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化

データエンジニアリングの実践に向けて、準備を進めましょう!

📝

学習メモ

Docker・コンテナ技術入門 - Step 11

📋 過去のメモ一覧
#artnasekai #学習メモ
LINE