Skip to content

Commit

Permalink
chore: add Dockerfile
Browse files Browse the repository at this point in the history
  • Loading branch information
OrKoN committed Jun 23, 2022
1 parent 657e0b5 commit fff3de2
Show file tree
Hide file tree
Showing 5 changed files with 105 additions and 0 deletions.
32 changes: 32 additions & 0 deletions .github/workflows/ci.yml
Expand Up @@ -253,3 +253,35 @@ jobs:
max_attempts: 1
command: npm run test:unit:chrome-headless
timeout_minutes: 30

docker-checks:
runs-on: ${{ matrix.os }}
strategy:
matrix:
os: [ubuntu-latest]
node: [16]
steps:
- name: Checkout
uses: actions/checkout@v3
with:
fetch-depth: 2
- name: Set up Node.js
uses: actions/setup-node@v3.1.1
with:
node-version: ${{ matrix.node }}
- name: Install dependencies
run: |
npm install
ls .local-chromium
- name: Build
run: |
npm run build
docker/pack.sh
- name: Build docker image
working-directory: ./docker
run: |
docker build -t puppeteer-test-image .
- name: Run smoke test
working-directory: ./docker
run: |
docker run -i --init --cap-add=SYS_ADMIN --rm puppeteer-test-image node -e "`cat test/smoke-test.js`"
32 changes: 32 additions & 0 deletions docker/Dockerfile
@@ -0,0 +1,32 @@
FROM node:16

# Install latest chrome dev package and fonts to support major charsets (Chinese, Japanese, Arabic, Hebrew, Thai and a few others)
# Note: this installs the necessary libs to make the bundled version of Chromium that Puppeteer
# installs, work.
RUN apt-get update \
&& apt-get install -y wget gnupg \
&& wget -q -O - https://dl-ssl.google.com/linux/linux_signing_key.pub | apt-key add - \
&& sh -c 'echo "deb [arch=amd64] http://dl.google.com/linux/chrome/deb/ stable main" >> /etc/apt/sources.list.d/google.list' \
&& apt-get update \
&& apt-get install -y google-chrome-stable fonts-ipafont-gothic fonts-wqy-zenhei fonts-thai-tlwg fonts-kacst fonts-freefont-ttf libxss1 \
--no-install-recommends \
&& rm -rf /var/lib/apt/lists/*

WORKDIR /home/pptruser

COPY puppeteer-latest.tgz /home/pptruser/puppeteer-latest.tgz

# Install puppeteer into /home/pptruser/node_modules.
RUN npm i ./puppeteer-latest.tgz \
&& rm puppeteer-latest.tgz \
# Add user so we don't need --no-sandbox.
# same layer as npm install to keep re-chowned files from using up several hundred MBs more space
&& groupadd -r pptruser && useradd -r -g pptruser -G audio,video pptruser \
&& mkdir -p /home/pptruser/Downloads \
&& chown -R pptruser:pptruser /home/pptruser \
# TODO: uncomment once M104 happens.
# && node -e "require('fs').writeFileSync('THIRD_PARTY_NOTICES', require('child_process').execSync(require('puppeteer').executablePath() + ' --credits'))"

USER pptruser

CMD ["google-chrome-stable"]
19 changes: 19 additions & 0 deletions docker/README.md
@@ -0,0 +1,19 @@
# Dockerfile for Puppeteer

This directory contains files needed to containerize Puppeteer. The major problem
that this is solving is the problem of providing all dependencies required to run a
browser instance.

## Building the image

```sh
docker build -t puppeteer-chrome-linux . # `puppeteer-chrome-linux` is the name of the image.
```

## Running the image

```sh
docker run -i --init --rm --cap-add=SYS_ADMIN --name puppeteer-chrome puppeteer-chrome-linux node -e "`cat test.js`"
```

`--cap-add=SYS_ADMIN` capability is needed to enable Chromium sandbox that makes the browser more secure. Alternatively, it should be possible to start the browser binary with the `--no-sandbox` flag.
13 changes: 13 additions & 0 deletions docker/pack.sh
@@ -0,0 +1,13 @@
#!/bin/bash

# Packs puppeteer using npm and moves the archive file to docker/puppeteer-latest.tgz.
# Expected cwd: project root directory.

set -e
set +x

FILENAME=$(npm pack)

echo $FILENAME

mv $FILENAME docker/puppeteer-latest.tgz
9 changes: 9 additions & 0 deletions docker/test/smoke-test.js
@@ -0,0 +1,9 @@
const puppeteer = require('puppeteer');

(async () => {
const browser = await puppeteer.launch();
const page = await browser.newPage();
await page.goto('https://example.com');
await browser.close();
console.log('done');
})();

0 comments on commit fff3de2

Please sign in to comment.