はじめに
E2E テストの実行手順として、こんなコマンドを見たことはないだろうか。
docker run --rm --network host \
-v $(pwd):/work -w /work \
-e CI=true \
mcr.microsoft.com/playwright:v1.54.0-noble \
npx playwright test
ローカルにブラウザや依存ライブラリを入れなくても、E2E テストが動く。
👉 便利なのでコピペで使いがち。でも --rm や -w の意味を聞かれて説明できるだろうか?
この記事では、このワンライナーを1つずつ分解して読めるようにする。
全体の文法
docker run の構造はこうなっている。
docker run [オプション] イメージ [コマンド]
冒頭のワンライナーを当てはめると:
| 部分 | 該当箇所 |
|---|---|
| オプション | --rm --network host -v $(pwd):/work -w /work -e CI=true |
| イメージ | mcr.microsoft.com/playwright:v1.54.0-noble |
| コマンド | npx playwright test |
👉 イメージ名より前が Docker への指示、イメージ名より後がコンテナの中で実行されるコマンド
❌ npx playwright test はホストで実行されるわけではない。コンテナの中で動く。
実行イメージ指定
mcr.microsoft.com/playwright:v1.54.0-noble は3つの部分に分解できる。
mcr.microsoft.com / playwright : v1.54.0-noble
└─ レジストリ └─ イメージ名 └─ タグ
- レジストリ:イメージの置き場所。ここでは Microsoft Container Registry。省略すると Docker Hub になる
- イメージ名:どのイメージを使うか
-
タグ:どのバージョンを使うか。省略すると
latest
この公式イメージには、Node.js・ブラウザ(Chromium / Firefox / WebKit)・依存ライブラリが入っている。
❌ Playwright 本体(npm パッケージ)はイメージに含まれない。-v でマウントしたプロジェクトの node_modules にあるものが実行される。
👉 ブラウザとその依存ライブラリをホストに入れなくていいのが、このイメージを使う最大の理由
--rm:終了後にコンテナを自動削除
コンテナは終了しても自動では消えない。停止状態のまま残り続ける。
docker ps -a
# → Exited (0) のコンテナがずらずら…
--rm を付けると、コマンドの終了と同時にコンテナが削除される。
- テスト実行は「実行して結果を見たら終わり」の使い捨て
- コンテナを残しておく理由がない
👉 一回きりのコマンド実行では、ほぼ必ず付けるオプション
--network host:ホストのネットワークをそのまま使う
E2E テストは、ホストで起動中の dev サーバー(例:localhost:3000)にアクセスしたい。
デフォルト(ブリッジネットワーク)では、コンテナは独立したネットワークを持つ。
❌ デフォルトの場合
コンテナ内の localhost:3000 → コンテナ自身の 3000 番(何もいない)
--network host を付けると、コンテナはホストのネットワークをそのまま使う。
✅ --network host の場合
コンテナ内の localhost:3000 → ホストの 3000 番(dev サーバーに届く)
👉 「コンテナの中からホストの localhost に繋ぎたい」ときの選択肢
-v $(pwd):/work:カレントディレクトリをマウント
-v ホスト側のパス:コンテナ側のパス
$(pwd) はカレントディレクトリに展開される。つまり「今いるディレクトリを、コンテナ内の /work として見せる」。
これが入口と出口の両方になる:
-
入口:テストコード(
tests/やplaywright.config.ts)をコンテナに渡す -
出口:テスト結果(
test-results/やplaywright-report/)がホスト側に残る
👉 マウントしないと、コンテナはテストコードを見つけられないし、結果もコンテナの終了と一緒に消える
-w /work:作業ディレクトリの指定
コンテナ内でコマンドを実行するときの「今いる場所」を指定する。
-w /work ... npx playwright test
# ↓ イメージするならこれと同じ
cd /work && npx playwright test
-v でマウントした /work を、-w で作業ディレクトリにしている。
👉 -v $(pwd):/work -w /work は「今いるディレクトリで、そのままコマンドを実行する」ための定番ペア
-e CI=true:環境変数を渡す
-e 変数名=値
コンテナの中のプロセスに環境変数を渡す。
Playwright は CI 環境変数の有無で挙動を変える設定がよく使われる:
// playwright.config.ts
export default defineConfig({
retries: process.env.CI ? 2 : 0,
reporter: process.env.CI ? 'dot' : 'html',
});
👉 ホストの環境変数はコンテナに引き継がれない。渡したいものは -e で明示的に渡す
まとめ
| 要素 | 役割 |
|---|---|
--rm |
終了後にコンテナを自動削除(使い捨て実行) |
--network host |
ホストのネットワークをそのまま使う |
-v $(pwd):/work |
カレントディレクトリをコンテナにマウント |
-w /work |
コンテナ内の作業ディレクトリを指定 |
-e CI=true |
コンテナ内に環境変数を渡す |
mcr.microsoft.com/playwright:v1.54.0-noble |
レジストリ / イメージ名 / タグ |
npx playwright test |
コンテナ内で実行されるコマンド |
もう一度、冒頭のコマンドを見てみる。
docker run --rm --network host \
-v $(pwd):/work -w /work \
-e CI=true \
mcr.microsoft.com/playwright:v1.54.0-noble \
npx playwright test
👉 「使い捨てコンテナで、ホストのネットワークとカレントディレクトリを共有しながら、CI モードで Playwright を実行する」と読めれば OK。