Входной диагноз
Тест локально проходит, а в 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"]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 / SIGBUS | Shared 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».
Проверка понимания
Первичный источник
- Playwright: Docker — основной материал, версии image и runtime flags.
- Playwright: Continuous Integration — CI-конфигурации и debug.
- Docker bind mounts — вынос test artifacts.
При реальном browser crash принесите преподавателю trace, container limits и точные версии package/image.