🍊

初心者向け 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