From ef3bafcf74dc591de29e9608f46cb3ff0c7a8cd2 Mon Sep 17 00:00:00 2001 From: Marcus Efraimsson Date: Mon, 9 Sep 2019 21:28:26 +0200 Subject: [PATCH] switch docker base to node:10-alpine --- .dockerignore | 7 +++++++ Dockerfile | 31 ++++++++++++++++--------------- src/browser.ts | 48 ++++++++++++++++++++++++++++-------------------- 3 files changed, 51 insertions(+), 35 deletions(-) create mode 100644 .dockerignore diff --git a/.dockerignore b/.dockerignore new file mode 100644 index 00000000..1fa4e22a --- /dev/null +++ b/.dockerignore @@ -0,0 +1,7 @@ +.circleci +docker +node_modules +scripts +Dockerfile +Makefile +plugin_start* diff --git a/Dockerfile b/Dockerfile index 62fb9038..7404aadd 100644 --- a/Dockerfile +++ b/Dockerfile @@ -1,26 +1,27 @@ -FROM node:10 AS base +FROM node:10-alpine AS base + +ENV CHROME_BIN="/usr/bin/chromium-browser" +ENV PUPPETEER_SKIP_CHROMIUM_DOWNLOAD="true" WORKDIR /usr/src/app -RUN apt-get update && \ -apt-get install -yq gconf-service libasound2 libatk1.0-0 libc6 libcairo2 libcups2 libdbus-1-3 \ -libexpat1 libfontconfig1 libgcc1 libgconf-2-4 libgdk-pixbuf2.0-0 libglib2.0-0 libgtk-3-0 libnspr4 \ -libpango-1.0-0 libpangocairo-1.0-0 libstdc++6 libx11-6 libx11-xcb1 libxcb1 libxcomposite1 \ -libxcursor1 libxdamage1 libxext6 libxfixes3 libxi6 libxrandr2 libxrender1 libxss1 libxtst6 \ -fonts-ipafont-gothic fonts-wqy-zenhei fonts-thai-tlwg fonts-kacst ttf-freefont \ -ca-certificates fonts-liberation libappindicator1 libnss3 lsb-release xdg-utils wget && \ -wget https://github.com/Yelp/dumb-init/releases/download/v1.2.1/dumb-init_1.2.1_amd64.deb && \ -dpkg -i dumb-init_*.deb && rm -f dumb-init_*.deb && \ -apt-get clean && apt-get autoremove -y && rm -rf /var/lib/apt/lists/* +RUN \ + echo "http://dl-cdn.alpinelinux.org/alpine/edge/community" >> /etc/apk/repositories \ + && echo "http://dl-cdn.alpinelinux.org/alpine/edge/main" >> /etc/apk/repositories \ + && echo "http://dl-cdn.alpinelinux.org/alpine/edge/testing" >> /etc/apk/repositories \ + && apk --no-cache update \ + && apk --no-cache upgrade \ + && apk add --no-cache --virtual .build-deps \ + udev ttf-opensans chromium \ + ca-certificates dumb-init \ + && rm -rf /var/cache/apk/* /tmp/* FROM base as build -RUN npm install -g typescript - COPY . ./ -RUN yarn install --pure-lockfile && \ - yarn run build +RUN yarn install --pure-lockfile +RUN yarn run build EXPOSE 8081 diff --git a/src/browser.ts b/src/browser.ts index c6014d93..187d832c 100644 --- a/src/browser.ts +++ b/src/browser.ts @@ -5,9 +5,7 @@ import { Logger } from './logger'; import uniqueFilename = require('unique-filename'); export class Browser { - - constructor(private log: Logger) { - } + constructor(private log: Logger) {} validateOptions(options) { options.width = parseInt(options.width) || 1000; @@ -36,7 +34,7 @@ export class Browser { if ((process as any).pkg) { const parts = puppeteer.executablePath().split(path.sep); - while(!parts[0].startsWith('chrome-')) { + while (!parts[0].startsWith('chrome-')) { parts.shift(); } const executablePath = [path.dirname(process.execPath), ...parts].join(path.sep); @@ -47,10 +45,18 @@ export class Browser { args: ['--no-sandbox'], }); } else { - browser = await puppeteer.launch({ - env: env, - args: ['--no-sandbox'], - }); + if (env['CHROME_BIN']) { + browser = await puppeteer.launch({ + executablePath: env['CHROME_BIN'], + env: env, + args: ['--no-sandbox'], + }); + } else { + browser = await puppeteer.launch({ + env: env, + args: ['--no-sandbox'], + }); + } } page = await browser.newPage(); @@ -61,29 +67,32 @@ export class Browser { }); await page.setCookie({ - 'name': 'renderKey', - 'value': options.renderKey, - 'domain': options.domain, + name: 'renderKey', + value: options.renderKey, + domain: options.domain, }); await page.goto(options.url); // wait for all panels to render - await page.waitForFunction(() => { - const panelCount = document.querySelectorAll('.panel').length || document.querySelectorAll('.panel-container').length; - return (window).panelsRendered >= panelCount; - }, { - timeout: options.timeout * 1000 - }); + await page.waitForFunction( + () => { + const panelCount = + document.querySelectorAll('.panel').length || document.querySelectorAll('.panel-container').length; + return (window).panelsRendered >= panelCount; + }, + { + timeout: options.timeout * 1000, + } + ); if (!options.filePath) { options.filePath = uniqueFilename(os.tmpdir()) + '.png'; } - await page.screenshot({path: options.filePath}); + await page.screenshot({ path: options.filePath }); return { filePath: options.filePath }; - } finally { if (page) { await page.close(); @@ -94,4 +103,3 @@ export class Browser { } } } -