初心者向け Dockerfileの作り方
ここでは「Playwrightを使ったスクレイピング用Dockerコンテナ」を例に、
Dockerfileの書き方を構造的に解説します。
1. Dockerfileとは?
Dockerfileは、コンテナの設計図です。
どんなOSを使うか、どんなライブラリや依存を入れるか、どんなコマンドを実行するかを順番に書いていきます。
2. 基本構成
Dockerfileは次のような構成で書きます
# ベースイメージを指定
FROM ...
# 作業ディレクトリを設定
WORKDIR /app
# 依存ファイルをコピー
COPY requirements.txt .
# Pythonライブラリをインストール
RUN pip install --no-cache-dir -r requirements.txt
# ソースコードをコピー
COPY . .
# コンテナ起動時のコマンド
CMD ["python", "main.py"]
これがDockerfileの基本の流れです。
3. Playwrightスクレイピング用のDockerfile例
Playwrightはヘッドレスブラウザ(Chromium、Firefox、WebKit)を使うため、
ブラウザの依存関係(ライブラリ)が必要になります。
公式イメージにそれらがすべて入っているので、Playwright公式イメージを使うのが簡単です。
例:Dockerfile
# Playwright公式のPythonベースイメージを使用
FROM mcr.microsoft.com/playwright/python:v1.47.0-jammy
# 作業ディレクトリを作成
WORKDIR /app
# 必要ファイルをコピー
COPY requirements.txt .
# Pythonパッケージをインストール
RUN pip install --no-cache-dir -r requirements.txt
# 残りのソースコードをコピー
COPY . .
# Playwrightブラウザをインストール(初回のみ必要)
RUN playwright install --with-deps chromium
# デフォルトの実行コマンド
CMD ["python", "main.py"]
例:requirements.txt
playwright
beautifulsoup4
pandas
requests
例:main.py
from playwright.sync_api import sync_playwright
def scrape_example():
with sync_playwright() as p:
browser = p.chromium.launch(headless=True)
page = browser.new_page()
page.goto("https://example.com")
title = page.title()
print(f"ページタイトル: {title}")
browser.close()
if __name__ == "__main__":
scrape_example()
- 実行方法
# イメージをビルド
docker build -t playwright-scraper .
# コンテナを起動
docker run --rm playwright-scraper
Dockerfileの内容について一つずつ解説していきます
4. ベースイメージ
FROM mcr.microsoft.com/playwright/python:v1.47.0-jammy
FROM で指定する「ベースイメージ」は、
Dockerコンテナの土台となるOSと環境です。
Playwrightの場合、普通の python:3.11 などのベースイメージを使うと、
ブラウザ依存ライブラリを自分で入れなければいけません。
しかし公式のPlaywrightイメージを使うと、それらが全部最初から入っているのです。
- ベースイメージ構成
mcr.microsoft.com/playwright/python:v1.47.0-jammy の中には以下のものが含まれます
-
Ubuntu 22.04 (Jammy Jellyfish) ベース
-
Python(通常は3.11)
-
Node.js(Playwrightが内部的に使用)
-
Playwrightライブラリ(Python版)
-
ブラウザ:Chromium, Firefox, WebKit
-
ブラウザ依存パッケージ
-
libnss3, libatk1.0, libcups2, libx11-xcb1 など
-
普通のPythonイメージでは自分でapt installが必要なもの
- もしPythonだけの軽量版がいい場合
Playwrightのブラウザ部分を後から入れたいなら、
次のようにしてもOK
FROM python:3.11-slim
# Playwrightとブラウザ依存を入れる
RUN pip install playwright && \
playwright install --with-deps chromium
ただし、これだとビルド時にブラウザをダウンロードするため、
ビルド時間が長くなり、イメージサイズもやや大きくなります。
5. 作業ディレクトリを作成
WORKDIR /app
WORKDIR で指定した作業ディレクトリは「コンテナの中」に作られます。
Dockerコンテナは、ホスト(自分のPC)とは分離された仮想ファイルシステムを持っています。
Dockerfileで書く WORKDIR /app は、この「コンテナ内部」に /app というディレクトリを作って、
以降の作業(COPY, RUN, CMD など)をその中で実行する、という意味です。
- 図で表すと
ローカル側(ホスト)
├── project/
│ ├── Dockerfile
│ ├── main.py
│ └── requirements.txt
コンテナ側(内部ファイルシステム)
├── /app/
│ ├── main.py
│ └── requirements.txt
ローカルの project/ は、
ビルド時に中身だけが WORKDIR はコンテナ内部の仮想フォルダの /app にコピーされます。
6. ソースコードをコピー
COPY . .
COPY 命令には 2つの引数 があります
<コピー元> ローカル(ホスト)側のパス
<コピー先> コンテナ(イメージ)内のパス
最初の . ローカル側のカレントディレクトリ(Dockerfileがある場所)
2つ目の . コンテナ内のカレントディレクトリ(= /app)
7. RUN と CMD の違い
両方とも「コマンドを実行する」ように見えますが、タイミングと目的がまったく違います
- 実行されるタイミング
RUN : イメージのビルド時
CMD : コンテナの起動時 - 目的
RUN : イメージの中に何かを「作る」
CMD : コンテナを「起動したときに動かす」 - 実行結果
RUN : イメージに「反映される」
CMD : 実行するだけ(イメージは変わらない) - 回数
RUN : 複数書ける(全部実行)
CMD : 最後の1つだけ有効
まとめ
- FROM ベースイメージ選択(Playwrightなら公式を使う)
- WORKDIR 作業ディレクトリ設定
- COPY コード・依存ファイルを転送
- RUN 依存をインストール
- CMD コンテナ起動時のコマンド指定
Discussion