mirror of
https://github.com/microsoft/playwright.git
synced 2025-06-26 21:40:17 +00:00
170 lines
8.1 KiB
Markdown
170 lines
8.1 KiB
Markdown
![]() |
---
|
||
|
id: docker
|
||
|
title: "Docker"
|
||
|
---
|
||
|
|
||
|
[Dockerfile.bionic](https://github.com/microsoft/playwright/blob/master/utils/docker/Dockerfile.bionic) and [Dockerfile.focal](https://github.com/microsoft/playwright/blob/master/utils/docker/Dockerfile.focal) can be used to run Playwright scripts in Docker environments. These images includes all the dependencies needed to run browsers in a Docker container, including browsers.
|
||
|
|
||
|
- [Usage](#usage)
|
||
|
- [Image tags](#image-tags)
|
||
|
- [Development](#development)
|
||
|
- [Base images](#base-images)
|
||
|
|
||
|
## Usage
|
||
|
|
||
|
[](https://hub.docker.com/_/microsoft-playwright)
|
||
|
|
||
|
This image is published on [Docker Hub](https://hub.docker.com/_/microsoft-playwright).
|
||
|
|
||
|
### Pull the image
|
||
|
|
||
|
```
|
||
|
$ docker pull mcr.microsoft.com/playwright:bionic
|
||
|
```
|
||
|
|
||
|
### Run the image
|
||
|
|
||
|
By default, the Docker image will use the `root` user to run the browsers. This will disable the Chromium sandbox which is not available with root. If you run trusted code (e.g. End-to-end tests) and want to avoid the hassle of managing separate user then the root user may be fine. For web scraping or crawling, we recommend to create a separate user inside the Docker container and use the seccomp profile.
|
||
|
|
||
|
#### End-to-end tests
|
||
|
|
||
|
On trusted websites, you can avoid creating a separate user and use root for it since you trust the code which will run on the browsers.
|
||
|
|
||
|
```
|
||
|
docker run -it --rm --ipc=host mcr.microsoft.com/playwright:bionic /bin/bash
|
||
|
```
|
||
|
|
||
|
#### Crawling and scraping
|
||
|
|
||
|
On untrusted websites, it's recommended to use a separate user for launching the browsers in combination with the seccomp profile. Inside the container or if you are using the Docker image as a base image you have to use `adduser` for it.
|
||
|
|
||
|
```
|
||
|
$ docker run -it --rm --ipc=host --user pwuser --security-opt seccomp=seccomp_profile.json mcr.microsoft.com/playwright:bionic /bin/bash
|
||
|
```
|
||
|
|
||
|
[`seccomp_profile.json`](https://github.com/microsoft/playwright/blob/master/utils/docker/seccomp_profile.json) is needed to run Chromium with sandbox. This is a [default Docker seccomp profile](https://github.com/docker/engine/blob/d0d99b04cf6e00ed3fc27e81fc3d94e7eda70af3/profiles/seccomp/default.json) with extra user namespace cloning permissions:
|
||
|
|
||
|
```json
|
||
|
[
|
||
|
{
|
||
|
"comment": "Allow create user namespaces",
|
||
|
"names": [
|
||
|
"clone",
|
||
|
"setns",
|
||
|
"unshare"
|
||
|
],
|
||
|
"action": "SCMP_ACT_ALLOW",
|
||
|
"args": [],
|
||
|
"includes": {},
|
||
|
"excludes": {}
|
||
|
}
|
||
|
]
|
||
|
```
|
||
|
|
||
|
> **NOTE**: Using `--ipc=host` is recommended when using Chrome ([Docker docs](https://docs.docker.com/engine/reference/run/#ipc-settings---ipc)). Chrome can run out of memory without this flag.
|
||
|
|
||
|
### Using on CI
|
||
|
|
||
|
See our [Continuous Integration guides](./ci.md) for sample configs.
|
||
|
|
||
|
## Image tags
|
||
|
|
||
|
See [all available image tags](https://mcr.microsoft.com/v2/playwright/tags/list).
|
||
|
|
||
|
## Development
|
||
|
|
||
|
### Build the image
|
||
|
|
||
|
Use [`//utils/docker/build.sh`](https://github.com/microsoft/playwright/blob/master/utils/docker/build.sh) to build the image.
|
||
|
|
||
|
```
|
||
|
$ ./utils/docker/build.sh bionic playwright:localbuild-bionic
|
||
|
```
|
||
|
|
||
|
The image will be tagged as `playwright:localbuild-bionic` and could be run as:
|
||
|
|
||
|
```
|
||
|
$ docker run --rm -it playwright:localbuild /bin/bash
|
||
|
```
|
||
|
|
||
|
### Push
|
||
|
|
||
|
Docker images are published automatically by GitHub Actions. We currently publish the following images:
|
||
|
- `mcr.microsoft.com/playwright:next` - tip-of-tree image version.
|
||
|
- `mcr.microsoft.com/playwright:bionic` - last Playwright release docker image.
|
||
|
- `mcr.microsoft.com/playwright:sha-XXXXXXX` - docker image for every commit that changed docker files or browsers, marked with a [short sha](https://git-scm.com/book/en/v2/Git-Tools-Revision-Selection#Short-SHA-1) (first 7 digits of the SHA commit).
|
||
|
|
||
|
Status of push to MCR can be [verified here](https://mcrflow-status-ui.azurewebsites.net/) (internal link).
|
||
|
|
||
|
## Base images
|
||
|
|
||
|
### Ubuntu 20
|
||
|
|
||
|
`mcr.microsoft.com/playwright:focal` is based on Ubuntu 20.04 LTS (Focal Fossa).
|
||
|
|
||
|
### Ubuntu 18
|
||
|
|
||
|
`mcr.microsoft.com/playwright:bionic` is based on Ubuntu 18.04 LTS (Bionic Beaver).
|
||
|
|
||
|
### Alpine
|
||
|
|
||
|
Browser builds for Firefox and WebKit are built for the [glibc](https://en.wikipedia.org/wiki/GNU_C_Library) library. Alpine Linux and other distributions that are based on the [musl](https://en.wikipedia.org/wiki/Musl) standard library are not supported.
|
||
|
|
||
|
[Playwright]: api/class-playwright.md "Playwright"
|
||
|
[Browser]: api/class-browser.md "Browser"
|
||
|
[BrowserContext]: api/class-browsercontext.md "BrowserContext"
|
||
|
[Page]: api/class-page.md "Page"
|
||
|
[Frame]: api/class-frame.md "Frame"
|
||
|
[ElementHandle]: api/class-elementhandle.md "ElementHandle"
|
||
|
[JSHandle]: api/class-jshandle.md "JSHandle"
|
||
|
[ConsoleMessage]: api/class-consolemessage.md "ConsoleMessage"
|
||
|
[Dialog]: api/class-dialog.md "Dialog"
|
||
|
[Download]: api/class-download.md "Download"
|
||
|
[Video]: api/class-video.md "Video"
|
||
|
[FileChooser]: api/class-filechooser.md "FileChooser"
|
||
|
[Keyboard]: api/class-keyboard.md "Keyboard"
|
||
|
[Mouse]: api/class-mouse.md "Mouse"
|
||
|
[Touchscreen]: api/class-touchscreen.md "Touchscreen"
|
||
|
[Request]: api/class-request.md "Request"
|
||
|
[Response]: api/class-response.md "Response"
|
||
|
[Selectors]: api/class-selectors.md "Selectors"
|
||
|
[Route]: api/class-route.md "Route"
|
||
|
[WebSocket]: api/class-websocket.md "WebSocket"
|
||
|
[TimeoutError]: api/class-timeouterror.md "TimeoutError"
|
||
|
[Accessibility]: api/class-accessibility.md "Accessibility"
|
||
|
[Worker]: api/class-worker.md "Worker"
|
||
|
[BrowserServer]: api/class-browserserver.md "BrowserServer"
|
||
|
[BrowserType]: api/class-browsertype.md "BrowserType"
|
||
|
[Logger]: api/class-logger.md "Logger"
|
||
|
[ChromiumBrowser]: api/class-chromiumbrowser.md "ChromiumBrowser"
|
||
|
[ChromiumBrowserContext]: api/class-chromiumbrowsercontext.md "ChromiumBrowserContext"
|
||
|
[ChromiumCoverage]: api/class-chromiumcoverage.md "ChromiumCoverage"
|
||
|
[CDPSession]: api/class-cdpsession.md "CDPSession"
|
||
|
[FirefoxBrowser]: api/class-firefoxbrowser.md "FirefoxBrowser"
|
||
|
[WebKitBrowser]: api/class-webkitbrowser.md "WebKitBrowser"
|
||
|
[Array]: https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Array "Array"
|
||
|
[Buffer]: https://nodejs.org/api/buffer.html#buffer_class_buffer "Buffer"
|
||
|
[ChildProcess]: https://nodejs.org/api/child_process.html "ChildProcess"
|
||
|
[Element]: https://developer.mozilla.org/en-US/docs/Web/API/element "Element"
|
||
|
[Error]: https://nodejs.org/api/errors.html#errors_class_error "Error"
|
||
|
[Evaluation Argument]: ./core-concepts.md#evaluationargument "Evaluation Argument"
|
||
|
[Map]: https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Map "Map"
|
||
|
[Object]: https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Object "Object"
|
||
|
[Promise]: https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Promise "Promise"
|
||
|
[RegExp]: https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/RegExp "RegExp"
|
||
|
[Serializable]: https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/JSON/stringify#Description "Serializable"
|
||
|
[UIEvent.detail]: https://developer.mozilla.org/en-US/docs/Web/API/UIEvent/detail "UIEvent.detail"
|
||
|
[URL]: https://nodejs.org/api/url.html "URL"
|
||
|
[USKeyboardLayout]: ../src/usKeyboardLayout.ts "USKeyboardLayout"
|
||
|
[UnixTime]: https://en.wikipedia.org/wiki/Unix_time "Unix Time"
|
||
|
[boolean]: https://developer.mozilla.org/en-US/docs/Web/JavaScript/Data_structures#Boolean_type "Boolean"
|
||
|
[function]: https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Function "Function"
|
||
|
[iterator]: https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Iteration_protocols "Iterator"
|
||
|
[null]: https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/null "null"
|
||
|
[number]: https://developer.mozilla.org/en-US/docs/Web/JavaScript/Data_structures#Number_type "Number"
|
||
|
[origin]: https://developer.mozilla.org/en-US/docs/Glossary/Origin "Origin"
|
||
|
[selector]: https://developer.mozilla.org/en-US/docs/Web/CSS/CSS_Selectors "selector"
|
||
|
[Readable]: https://nodejs.org/api/stream.html#stream_class_stream_readable "Readable"
|
||
|
[string]: https://developer.mozilla.org/en-US/docs/Web/JavaScript/Data_structures#String_type "string"
|
||
|
[xpath]: https://developer.mozilla.org/en-US/docs/Web/XPath "xpath"
|