そういうつまずきは、実際によくあります。
原因はほぼ決まっています。
PlaywrightはChromium・Firefox・WebKitの実ブラウザを起動するため、通常のNode.jsイメージには含まれていないOSライブラリが数十本必要です。
その依存関係をDockerfileで正しく解決できていないことが、エラーの根本原因です。
この記事では、playwright dockerfileの設計方法を解説します。
公式イメージを活用する最短ルートと、自前Dockerfileで依存関係を解決する方法の両方を紹介します。
docker-compose連携とCI組み込みまでを対象範囲とします。
この記事のポイント
・Playwright公式Dockerイメージを使えば依存関係の問題を最短で解決できる
・自前Dockerfileでは npx playwright install-deps でパッケージを自動解決する
・docker-composeでテスト実行コンテナとアプリコンテナを分離する設計が基本
・test-resultsをボリュームマウントしてCIでレポートを取り出す
でも安心してください。プロのエンジニアはコマンドを暗記していません。
「現場で使える型」を効率よく使いこなしているだけです。
PlaywrightのDockerfileで依存関係エラーが出る原因
Playwrightを通常の node:20 イメージで動かそうとすると、ほぼ確実に失敗します。「Executable doesn't exist at /root/.cache/ms-playwright/chromium-...」や「libnss3.so: cannot open shared object file」が代表的なエラーです。
理由は2点あります。
1. ブラウザ依存パッケージの量
PlaywrightはNode.jsだけでは動作せず、実際のブラウザプロセスを起動します。Chromiumだけでも libnss3・libgbm1・libasound2・libgtk-3-0 など数十本のシステムライブラリが必要です。
Debian/Ubuntuベースのイメージでは apt-get で追加できますが、必要なパッケージを手作業で洗い出すのは手間がかかります。
2. Alpineベースイメージとの相性問題
node:20-alpine はサイズが小さくて魅力的ですが、Playwrightとの相性は最悪です。Alpine Linux は musl libc を採用しているのに対し、Playwrightのブラウザバイナリは glibc を前提としてビルドされています。
この不一致は apt-get では解決できません。
Playwright用のコンテナ環境では、Debian/Ubuntuベースのイメージを選んでください。
公式Playwrightイメージを使ったDockerfileの設計
依存関係の問題を最短で解決するには、Microsoftが提供する公式Dockerイメージを使います。イメージには Chromium・Firefox・WebKit のブラウザと必要な依存パッケージが最初からインストールされています。
1. 基本的なDockerfileの書き方
# Dockerfile.playwright FROM mcr.microsoft.com/playwright:v1.48.0-jammy WORKDIR /app COPY package*.json ./ RUN npm ci COPY . .
package.json の playwright のバージョンを確認してから、同じバージョン番号のタグを選んでください。
タグ形式は「バージョン番号-jammy」(Ubuntu 22.04 LTS)が安定して使えます。
2. ビルドとブラウザ起動の確認
# イメージのビルド $ docker build -f Dockerfile.playwright -t my-playwright:latest . # ブラウザの起動確認(出力例。環境により異なります) $ docker run --rm my-playwright:latest npx playwright --version Version 1.48.0 # Chromiumの起動確認 $ docker run --rm my-playwright:latest npx playwright install --dry-run chromium
自前DockerfileでPlaywright環境を構築する手順
公式イメージを使えない事情がある場合は、 node:20-bookworm-slim をベースに自前で Dockerfile を書きます。npx playwright install-deps コマンドを使うと、現在の Playwright バージョンが要求するパッケージを自動的にインストールできます。
1. npx playwright install-depsを活用したDockerfile
# Dockerfile.playwright-custom FROM node:20-bookworm-slim WORKDIR /app # npm ci で node_modules を先にインストール COPY package*.json ./ RUN npm ci # Playwright の依存パッケージを自動解決(chromium のみに絞ると高速) RUN npx playwright install-deps chromium # ブラウザ本体のインストール RUN npx playwright install chromium COPY . .
ルートレスコンテナで実行する場合は、事前に apt-get でパッケージを手動インストールする方法も検討してください。
Dockerfileの設計については、Docker実践リファレンスでも手順を解説しています。
2. マルチステージビルドでイメージを軽量化する
ブラウザキャッシュのコピーを明示することで、実行ステージで再ダウンロードしなくて済みます。# --- ビルドステージ --- FROM mcr.microsoft.com/playwright:v1.48.0-jammy AS builder WORKDIR /app COPY package*.json ./ RUN npm ci COPY . . # --- 実行ステージ --- FROM mcr.microsoft.com/playwright:v1.48.0-jammy WORKDIR /app # ブラウザキャッシュをビルドステージから引き継ぐ COPY --from=builder /root/.cache/ms-playwright /root/.cache/ms-playwright COPY --from=builder /app/node_modules ./node_modules COPY --from=builder /app .
3. .dockerignoreで不要ファイルを除外する
ビルドコンテキストを小さくするため、.dockerignore を設置してください。# .dockerignore node_modules test-results playwright-report .git *.log
docker-composeでE2Eテスト環境を構成する
1. compose.ymlの基本構成
E2Eテストの典型的な構成は、テスト実行コンテナとアプリコンテナを分離するパターンです。# compose.playwright.yml services: playwright: build: context: . dockerfile: Dockerfile.playwright volumes: - ./test-results:/app/test-results - ./playwright-report:/app/playwright-report command: npx playwright test environment: - BASE_URL=http://app:3000 depends_on: - app app: image: your-app:latest ports: - "3000:3000"
コンテナ終了後もホスト側でテストレポートを確認できます。
2. テストの実行とレポート確認
# テストを実行(終了後にコンテナを削除) $ docker compose -f compose.playwright.yml run --rm playwright # 出力例(環境により異なります) Running 5 tests using 2 workers ✓ 1 [chromium] > tests/top.spec.ts:5:5 > トップページが表示される (1.2s) ✓ 2 [chromium] > tests/login.spec.ts:8:5 > ログインできる (2.4s) 5 passed (12.3s)
テストが1件でも失敗すると終了コードが1になるため、CIパイプラインでの合否判定に使えます。
3. GitHub ActionsでのCI組み込み
# .github/workflows/e2e.yml name: E2E Tests on: push: branches: [main] jobs: e2e: runs-on: ubuntu-latest steps: - uses: actions/checkout@v4 - name: Run Playwright tests run: docker compose -f compose.playwright.yml run --rm playwright - name: Upload test results uses: actions/upload-artifact@v4 if: always() with: name: playwright-report path: playwright-report/ retention-days: 30
よくあるエラーと対処法
1. 「Executable doesn't exist」エラー
Error: browserType.launch: Executable doesn't exist at /root/.cache/ms-playwright/chromium-1234/chrome-linux/chrome
Dockerfile の中で npx playwright install chromium を実行しているか確認してください。
公式イメージを使っている場合は、タグとプロジェクトの playwright バージョンが一致しているかを確認してください。
2. 「Host system is missing dependencies」エラー
╔════════════════════════════════════════════╗ ║ Host system is missing dependencies to run ║ ║ browsers. ║ ║ Missing libraries: ║ ║ libgbm.so.1 ║ ╚════════════════════════════════════════════╝
Dockerfile の中で RUN npx playwright install-deps chromium の行が実行されているか確認してください。
コンテナを起動して直接 npx playwright install-deps を実行すると、不足しているパッケージの一覧が表示されてインストールも実施されます。
3. スクリーンショットで日本語が文字化けする
テスト結果のスクリーンショットに含まれる日本語テキストが表示されない場合は、日本語フォントが入っていないことが原因です。# 日本語フォントの追加(Dockerfile に追記) RUN apt-get update && apt-get install -y \ fonts-noto-cjk \ && rm -rf /var/lib/apt/lists/*
本記事のまとめ
| やりたいこと | 対応方法 |
|---|---|
| 依存関係を最短で解決したい | mcr.microsoft.com/playwright:バージョン-jammy を使う |
| 自前Dockerfileで依存解決したい | node:20-bookworm-slim + npx playwright install-deps |
| Alpineベースにしたい | 非対応(glibc/musl非互換のためDebian系を選ぶ) |
| docker-composeでテストを実行したい | テスト実行コンテナとアプリコンテナを分離してtest-resultsをボリュームマウントする |
| CIでレポートを取り出したい | playwright-reportをアーティファクトとして保存する |
| スクリーンショットで日本語が文字化けする | fonts-noto-cjk を apt-get でインストールする |
DockerfileとE2E環境の設計から本番コンテナ運用まで、実践的な手順をまとめて解説しています。
>>Docker実践リファレンス
3,100名以上が実践した「型」を無料で公開中
プロのエンジニアはコマンドを暗記していません。
「現場で使える型」を効率よく使いこなしているだけです。
その「型」を図解60Pにまとめた入門マニュアルを、完全無料でプレゼントしています。
姓・名・メールの3つだけ/30秒/解除は3秒 / 詳細はこちら
- 前のページへ:DockerfileのPORT設定とホスト公開の対応関係|Compose連携で確認する実構成
- この記事の属するカテゴリ:Dockerへ戻る

無料メルマガで学習を続ける
Linuxの実践スキルをメールで毎週お届け。
登録は30秒、解除もいつでも可。
登録無料・いつでも解除できます