Урок 04 · Browser

Playwright внутри Docker

Зафиксируйте совместимые версии browser binaries и package, корректно обработайте PID 1 и вынесите test artifacts из эфемерного container.

Время: 20 минутРезультат: контейнерный test runИнтервью: flaky-инфраструктура

Входной диагноз

Тест локально проходит, а в container Chromium иногда падает или browser executable не найден. Какие различия окружений вы проверите первыми?

Что находится в официальном image

Официальный Playwright image содержит browser binaries и системные зависимости, но package @playwright/test устанавливается из проекта отдельно. Версия package должна совпадать с версией image, иначе Playwright может искать другой набор browser executables.

# package.json
"devDependencies": {
  "@playwright/test": "1.61.0"
}

# Dockerfile
FROM mcr.microsoft.com/playwright:v1.61.0-noble
WORKDIR /work
COPY package.json package-lock.json ./
RUN npm ci
COPY . .
CMD ["npx", "playwright", "test"]
Pin обеих сторонTag latest делает CI-запуск зависимым от внешнего обновления. Обновляйте package и image одним изменением и прогоняйте regression.

Запуск и артефакты

docker build --tag wms-playwright:dev .

docker run --rm \
  --init \
  --ipc=host \
  --volume "$PWD/test-results:/work/test-results" \
  --volume "$PWD/playwright-report:/work/playwright-report" \
  wms-playwright:dev
НастройкаЗачем
--rmУдалить test container после завершения; результаты уже вынесены.
--initДобавить init для корректного reap дочерних browser processes и сигналов.
--ipc=hostСнизить риск падения Chromium из-за ограниченной shared memory.
bind mountsСохранить trace, screenshots и HTML report на host/CI workspace.

Для доверенных end-to-end тестов официальный image по умолчанию запускает browsers от root и отключает Chromium sandbox. Для посещения недоверенных сайтов официальный гайд рекомендует отдельного пользователя и seccomp profile.

Четыре класса container-only ошибок

СимптомПроверка
Executable doesn't existСовпадают ли версии package и image; не перетёрт ли browser cache?
Chromium crash / SIGBUSShared memory, --ipc=host, лимиты container/runner.
Тест не видит localhostГде работает target: в том же container, на host или в другом service?
Report отсутствуетКуда пишет reporter; mounted ли каталог до завершения container?

Не добавляйте --cap-add=SYS_ADMIN как постоянный fix: документация предлагает его только как локальный диагностический шаг при странных browser launch errors.

Ответ уровня Senior

«Я pin-ю официальный Playwright image к той же версии, что @playwright/test, потому что image содержит browser binaries, а package устанавливается проектом. Для Chromium учитываю shared memory, для PID 1 использую init, результаты монтирую в CI workspace. При container-only flaky сначала сравниваю versions, resources, network namespace и filesystem permissions, а не увеличиваю retries».

Проверка понимания

1. Browser executable не найден после обновления.

2. Зачем Playwright рекомендует --ipc=host?

3. Что даёт --init?

Первичный источник

При реальном browser crash принесите преподавателю trace, container limits и точные версии package/image.