Playwright Docker Tutorial: Complete Step-by-Step Guide for Beginners

Introduction: Why Playwright Docker Matters in 2026

Running Playwright locally is a good starting point. However, enterprise automation often needs something more reliable: the same browser and operating-system environment across developers, CI servers, and test machines.

This is where Playwright Docker becomes useful.

Docker packages an application or testing environment into a container. With Playwright, that container can include the browser binaries and system dependencies required for browser automation.

The official Playwright Docker images include Playwright browsers and their browser system dependencies, but the Playwright npm package itself needs to be installed separately. Playwright also recommends pinning the Docker image version so that the browser version remains compatible with the Playwright version used by the project.

A typical architecture looks like this:

Developer / CI Server

       ↓

    Docker

       ↓

Playwright Container

       ↓

Playwright Test

       ↓

Chromium / Firefox / WebKit

       ↓

Application Under Test

This playwright docker tutorial explains how to build this setup from scratch and then use it with Docker Compose, CI/CD, reports, screenshots, traces, and parallel execution.


What Is Playwright Docker?

Playwright Docker means running Playwright automation tests inside a Docker container instead of directly on the host operating system.

Normally:

Windows/macOS/Linux

      ↓

Node.js

      ↓

Playwright

      ↓

Browsers

      ↓

Tests

With Docker:

Host Machine

    ↓

Docker Engine

    ↓

Playwright Container

┌──────────────────┐

│ Node.js           │

│ Playwright        │

│ Browser binaries  │

│ Browser libraries │

Test code         │

└──────────────────┘

The official Playwright image is intended for testing and development. Playwright currently publishes versioned images, including Ubuntu-based variants. Its documentation recommends using a specific image version rather than an unpinned version when reproducibility matters.


Why Run Playwright Tests in Docker?

There are several practical reasons.

1. Consistent environments

A developer might use Windows while the CI server uses Linux.

Docker can standardize the testing environment.

2. Browser dependencies

Browsers require operating-system libraries. The official Playwright image already contains the browser binaries and required system dependencies.

3. CI/CD compatibility

Docker makes it easier to create a predictable Playwright execution environment in Jenkins, GitHub Actions, Azure DevOps, GitLab CI, and other systems.

4. Easier scaling

Multiple containers can execute different test groups.

5. Reduced “works on my machine” problems

The test environment becomes part of the project infrastructure.


Docker and Playwright Prerequisites

Before starting this playwright docker tutorial, install:

  • Docker Desktop on Windows/macOS, or Docker Engine on Linux
  • Node.js
  • npm
  • Git
  • Basic TypeScript knowledge
  • Basic Playwright knowledge

Verify Docker:

docker –version

Verify Node:

node –version

Verify npm:

npm –version


Installing and Verifying Docker

After installing Docker Desktop or Docker Engine, run:

docker run hello-world

If Docker is configured correctly, Docker downloads and runs the test image.

Then verify Docker Compose:

docker compose version

Docker Compose is useful when Playwright needs to work alongside application services such as a frontend, backend, database, or mock API.


Creating a Playwright Docker Project

Create a Playwright project:

npm init playwright@latest

Select:

TypeScript

tests

Install Playwright browsers

You can test the project locally:

npx playwright test

Then create a simple test:

import { test, expect } from ‘@playwright/test’;

test(‘homepage validation’, async ({ page }) => {

 await page.goto(‘https://playwright.dev/’);

 await expect(page).toHaveTitle(/Playwright/);

});

This gives us the application code that will eventually run inside Docker.


Understanding the Playwright Docker Image

Playwright publishes official Docker images through Microsoft’s container registry.

For example, the official documentation currently shows:

docker pull mcr.microsoft.com/playwright:v1.62.0-noble

The noble tag represents Ubuntu 24.04 LTS in that release. Other versioned Ubuntu-based tags are also published.

The important rule is:

Keep the Playwright version in your project compatible with the Playwright version represented by the Docker image.

If the versions do not match, Playwright may not be able to locate the expected browser executables.


Creating a Dockerfile for Playwright

There are two common approaches:

  1. Use the official Playwright image.
  2. Build your own image.

For beginners, the official image is easier.

Create:

Dockerfile

with:

FROM mcr.microsoft.com/playwright:v1.62.0-noble

WORKDIR /app

COPY package*.json ./

RUN npm ci

COPY . .

CMD [“npx”, “playwright”, “test”]

Explanation

FROM

selects the Playwright environment.

WORKDIR /app

sets the working directory.

COPY package*.json ./

copies npm dependency files.

RUN npm ci

installs project dependencies.

COPY . .

copies the automation project.

CMD

runs the Playwright test suite.

The official Playwright documentation also shows a custom-image approach based on Node.js where browser dependencies are installed with playwright install –with-deps.


Installing Playwright Browsers Inside Docker

If you build from a normal Node image, you must install browser binaries and their system dependencies.

For example:

FROM node:20-bookworm

WORKDIR /app

COPY package*.json ./

RUN npm ci

RUN npx playwright install –with-deps

COPY . .

CMD [“npx”, “playwright”, “test”]

This is different from using the official Playwright image because the official image already contains the browsers and system dependencies.

For most beginner and CI scenarios, the official Playwright image is simpler.


Running Your First Playwright Test in Docker

Build the image:

docker build -t playwright-tests .

Run the tests:

docker run –rm –ipc=host playwright-tests

Playwright recommends –ipc=host when using Chromium because Chromium can otherwise run out of memory and crash in some Docker configurations. It also recommends –init to help avoid zombie processes.

A more complete command is:

docker run –rm –init –ipc=host playwright-tests


Playwright Docker Project Structure

A scalable project could look like:

playwright-docker-project/

├── tests/

│   ├── login.spec.ts

│   └── checkout.spec.ts

├── pages/

│   ├── LoginPage.ts

│   └── CheckoutPage.ts

├── fixtures/

├── test-data/

├── utils/

├── playwright.config.ts

├── package.json

├── package-lock.json

├── tsconfig.json

├── Dockerfile

├── compose.yaml

├── .dockerignore

└── README.md

Important files

FilePurpose
tests/Test cases
pages/Page Object Model
fixtures/Reusable Playwright fixtures
test-data/Test data
utils/Common utilities
playwright.config.tsTest configuration
DockerfileContainer image definition
compose.yamlMulti-container configuration
.dockerignoreFiles excluded from Docker build context

Docker Compose with Playwright

Docker Compose becomes useful when your tests need multiple services.

For example:

Playwright

   ↓

Frontend

   ↓

Backend

   ↓

Database

Create compose.yaml:

services:

 tests:

   build:

     context: .

     dockerfile: Dockerfile

   ipc: host

   init: true

   environment:

     PLAYWRIGHT_BASE_URL: http://app:3000

   depends_on:

     – app

 app:

   image: nginx:latest

   ports:

     – “3000:80”

Run:

docker compose up –build

Inside the Docker network, the Playwright container can access the application using:

http://app:3000

rather than assuming localhost refers to the host machine.


Browser Configuration and Headless Execution

CI containers normally execute browsers in headless mode.

Configure:

import { defineConfig } from ‘@playwright/test’;

export default defineConfig({

 use: {

   headless: true

 }

});

You can also configure multiple browser projects:

import { defineConfig, devices } from ‘@playwright/test’;

export default defineConfig({

 projects: [

   {

     name: ‘chromium’,

     use: { …devices[‘Desktop Chrome’] }

   },

   {

     name: ‘firefox’,

     use: { …devices[‘Desktop Firefox’] }

   },

   {

     name: ‘webkit’,

     use: { …devices[‘Desktop Safari’] }

   }

 ]

});

Then:

npx playwright test

can execute the suite against the configured projects.


Environment Variables and Playwright Docker

Avoid hard-coding environment-specific URLs.

Instead:

import { defineConfig } from ‘@playwright/test’;

export default defineConfig({

 use: {

   baseURL:

     process.env.PLAYWRIGHT_BASE_URL ||

     ‘https://example.com’

 }

});

Then run:

docker run \

 –rm \

 –ipc=host \

 -e PLAYWRIGHT_BASE_URL=https://qa.example.com \

 playwright-tests

Docker Compose also supports environment and env_file for passing configuration into containers. Docker recommends being careful with sensitive values and using secrets rather than casually putting passwords into environment variables.

For example:

services:

 tests:

   image: playwright-tests

   environment:

     PLAYWRIGHT_BASE_URL: ${PLAYWRIGHT_BASE_URL}

Docker Compose supports .env files and variable interpolation, with defined precedence rules for different sources.


Screenshots, Videos, Trace Viewer, and Reports in Docker

One common Docker problem is generating artifacts inside a container and then losing them when the container exits.

Configure Playwright:

import { defineConfig } from ‘@playwright/test’;

export default defineConfig({

 reporter: [

   [‘html’, { outputFolder: ‘playwright-report’ }],

   [‘junit’, { outputFile: ‘test-results/results.xml’ }]

 ],

 use: {

   screenshot: ‘only-on-failure’,

   video: ‘retain-on-failure’,

   trace: ‘retain-on-failure’

 }

});

Then mount the directories:

docker run \

 –rm \

 –ipc=host \

 -v “$(pwd)/playwright-report:/app/playwright-report” \

 -v “$(pwd)/test-results:/app/test-results” \

 playwright-tests

The results remain available on the host after the container stops.

Docker volumes and bind mounts are commonly used to make data available outside containers; Compose supports both approaches for service storage.


Running Playwright Docker Tests in Parallel

Playwright supports parallel execution through workers.

For example:

npx playwright test –workers=4

In Docker:

docker run \

 –rm \

 –ipc=host \

 playwright-tests \

 npx playwright test –workers=4

However, more workers do not always mean faster execution.

Performance depends on:

  • CPU
  • Memory
  • Browser count
  • Application capacity
  • Test design
  • Network latency
  • Number of containers
  • CI infrastructure

A practical enterprise strategy is often:

Large Regression Suite

       ↓

CI Jobs

┌──────┼──────┬──────┐

Job 1  Job 2  Job 3  Job 4

↓      ↓      ↓      ↓

Tests  Tests  Tests  Tests


Playwright Docker with GitHub Actions and CI/CD

Docker can be combined with GitHub Actions.

A simple workflow is:

name: Playwright Docker Tests

on:

 push:

   branches: [main]

 pull_request:

jobs:

 test:

   runs-on: ubuntu-latest

   steps:

     – name: Checkout

       uses: actions/checkout@v6

     – name: Build Docker image

       run: docker build -t playwright-tests .

     – name: Run Playwright tests

       run: |

         docker run \

           –rm \

           –init \

           –ipc=host \

           playwright-tests

For artifacts, add:

     – name: Upload Playwright report

       if: ${{ !cancelled() }}

       uses: actions/upload-artifact@v5

       with:

         name: playwright-report

         path: playwright-report/

The key idea is that the CI runner builds the same container used for automation and then executes the tests inside that environment.


Real-World Playwright Docker Automation Project

Consider an e-commerce application.

The automation project contains:

E-Commerce

   ↓

Login

   ↓

Search Product

   ↓

Open Product

   ↓

Add to Cart

   ↓

Checkout

   ↓

Payment Validation

A professional Dockerized architecture could be:

GitHub

  ↓

GitHub Actions

  ↓

Docker Build

  ↓

Playwright Container

  ↓

┌───────────┬───────────┬───────────┐

Chromium    Firefox     WebKit

  ↓           ↓           ↓

E-Commerce Application

  ↓

Reports + Screenshots + Traces

The GitHub repository can contain:

This makes a strong portfolio project for a QA Automation Engineer or SDET because it demonstrates both browser automation and basic DevOps knowledge.


Common Playwright Docker Errors and Solutions

1. Browser executable doesn’t exist

Try:

npx playwright install –with-deps

If using the official image, verify that the project Playwright version matches the image version.


2. Chromium crashes

Try:

docker run –rm –init –ipc=host playwright-tests

Playwright specifically recommends –ipc=host for Chromium to reduce memory-related crashes in Docker.


3. localhost doesn’t work

Inside a container, localhost refers to the container itself.

If your application is running in another Compose service, use the service name:

http://app:3000

If the application is running on the host and the platform supports Docker’s host gateway mapping, configure the appropriate host address rather than assuming container localhost points to the host. Playwright’s Docker documentation provides a host-gateway example for this scenario.


4. Reports disappear

Mount the report directory:

-v “$(pwd)/playwright-report:/app/playwright-report”

or upload the generated directory as a CI artifact.


5. Docker build is too large

Create .dockerignore:

node_modules

.git

playwright-report

test-results

.env

README.md

Excluding unnecessary files reduces the Docker build context. Docker’s documentation also recommends excluding sensitive files such as .env from build contexts.


Playwright Docker Best Practices

1. Pin the Playwright image

Prefer:

mcr.microsoft.com/playwright:v1.62.0-noble

over an unpinned floating tag when reproducibility matters.

2. Match project and image versions

The Playwright package and Docker image should be kept compatible.

3. Use –init

This helps with process handling inside containers.

4. Use –ipc=host for Chromium

This can help prevent Chromium memory-related crashes.

5. Keep secrets out of images

Do not bake passwords or tokens into Dockerfiles.

6. Store CI artifacts

Preserve:

7. Use environment-specific configuration

Use environment variables instead of changing source code for every environment.

8. Avoid unnecessary browser installations

If a pipeline only needs Chromium, configure it accordingly rather than installing every browser.

9. Keep containers disposable

A good automation container should be reproducible and safe to destroy after execution.

10. Be careful with untrusted websites

The official Playwright Docker documentation notes that its image is intended for testing and development and is not recommended for visiting untrusted websites. For untrusted crawling/scraping scenarios, Playwright recommends additional user and sandbox configuration.


Playwright Docker Interview Questions and Answers

1. What is Playwright Docker?

It is the practice of running Playwright browser automation inside a Docker container containing the required browser environment and dependencies.

2. Why use Docker with Playwright?

Docker provides a consistent, isolated environment that can reduce differences between developer machines and CI servers.

3. Does the Playwright Docker image contain Playwright?

The official Playwright image contains browsers and browser system dependencies, but the Playwright package must be installed separately in the project.

4. Why use –ipc=host?

It is recommended for Chromium because Chromium can run out of memory and crash without an appropriate IPC configuration.

5. Why should Playwright Docker versions be pinned?

A pinned version makes the browser environment reproducible and helps prevent incompatibility between the Docker image and project Playwright version.

6. How do you preserve Playwright reports from Docker?

Use bind mounts or volumes, or copy/upload the generated artifacts through your CI system.

7. Can Playwright Docker run in GitHub Actions?

Yes. A workflow can build or pull a Playwright image and execute the test suite inside a container.


Playwright Docker Learning Roadmap for Beginners

Follow this progression:

Docker Basics

    ↓

Docker Images & Containers

    ↓

Playwright Basics

    ↓

Dockerfile

    ↓

Playwright Docker Image

    ↓

Run Tests in Container

    ↓

Volumes & Artifacts

    ↓

Docker Compose

    ↓

Environment Variables

    ↓

Parallel Execution

    ↓

GitHub Actions

    ↓

Enterprise CI/CD

Once you understand this workflow, continue with Playwright Tutorial, Playwright Tutorial Step by Step, Playwright TypeScript Tutorial, Playwright Python Tutorial, Playwright Java Tutorial, Playwright CI/CD Pipeline, Playwright GitHub Actions, Playwright Page Object Model, Playwright Test Fixtures, Playwright Parallel Execution, Playwright Reporting, Playwright Trace Viewer, Playwright Framework Design, and Playwright Interview Questions.


FAQs About Playwright Docker

What is Playwright Docker?

Playwright Docker is a containerized environment for executing Playwright browser automation tests with consistent browser and operating-system dependencies.

How do I get started with Playwright Docker?

Create a Playwright project, create a Dockerfile based on a compatible Playwright image, build it with docker build, and execute the tests using docker run.

Does Playwright work with Docker?

Yes. Playwright provides official Docker images containing browser binaries and system dependencies for testing and development.

Can I use Playwright Docker for CI/CD?

Yes. Dockerized Playwright tests can run in CI platforms such as GitHub Actions, Jenkins, and Azure DevOps.

Why are Playwright browser versions important in Docker?

The Docker image contains specific browser builds. If the image and Playwright package versions are incompatible, Playwright may fail to locate the expected browser executable.

Can Playwright Docker run tests in parallel?

Yes. Playwright supports workers, and Docker can also be used as part of a larger distributed CI strategy. The actual performance depends on available CPU, memory, browser workload, and infrastructure.

Leave a Comment

Your email address will not be published. Required fields are marked *