├── .gitignore ├── Dockerfile ├── LICENSE └── README.md /.gitignore: -------------------------------------------------------------------------------- 1 | # Logs 2 | logs 3 | *.log 4 | npm-debug.log* 5 | yarn-debug.log* 6 | yarn-error.log* 7 | 8 | # Runtime data 9 | pids 10 | *.pid 11 | *.seed 12 | *.pid.lock 13 | 14 | # Directory for instrumented libs generated by jscoverage/JSCover 15 | lib-cov 16 | 17 | # Coverage directory used by tools like istanbul 18 | coverage 19 | 20 | # nyc test coverage 21 | .nyc_output 22 | 23 | # Grunt intermediate storage (http://gruntjs.com/creating-plugins#storing-task-files) 24 | .grunt 25 | 26 | # Bower dependency directory (https://bower.io/) 27 | bower_components 28 | 29 | # node-waf configuration 30 | .lock-wscript 31 | 32 | # Compiled binary addons (https://nodejs.org/api/addons.html) 33 | build/Release 34 | 35 | # Dependency directories 36 | node_modules/ 37 | jspm_packages/ 38 | 39 | # TypeScript v1 declaration files 40 | typings/ 41 | 42 | # Optional npm cache directory 43 | .npm 44 | 45 | # Optional eslint cache 46 | .eslintcache 47 | 48 | # Optional REPL history 49 | .node_repl_history 50 | 51 | # Output of 'npm pack' 52 | *.tgz 53 | 54 | # Yarn Integrity file 55 | .yarn-integrity 56 | 57 | # dotenv environment variables file 58 | .env 59 | 60 | # next.js build output 61 | .next 62 | -------------------------------------------------------------------------------- /Dockerfile: -------------------------------------------------------------------------------- 1 | FROM mcr.microsoft.com/azure-functions/node:2.0 2 | 3 | # See https://crbug.com/795759 4 | RUN apt-get update && apt-get install -yq libgconf-2-4 5 | 6 | # Install latest chrome dev package and fonts to support major charsets (Chinese, Japanese, Arabic, Hebrew, Thai and a few others) 7 | # Note: this installs the necessary libs to make the bundled version of Chromium that Puppeteer 8 | # installs, work. 9 | RUN apt-get update && apt-get install -y wget --no-install-recommends \ 10 | && wget -q -O - https://dl-ssl.google.com/linux/linux_signing_key.pub | apt-key add - \ 11 | && sh -c 'echo "deb [arch=amd64] http://dl.google.com/linux/chrome/deb/ stable main" >> /etc/apt/sources.list.d/google.list' \ 12 | && apt-get update \ 13 | && apt-get install -y google-chrome-unstable fonts-ipafont-gothic fonts-wqy-zenhei fonts-thai-tlwg fonts-kacst ttf-freefont \ 14 | --no-install-recommends \ 15 | && rm -rf /var/lib/apt/lists/* \ 16 | && apt-get purge --auto-remove -y curl \ 17 | && rm -rf /src/*.deb 18 | 19 | # It's a good idea to use dumb-init to help prevent zombie chrome processes. 20 | ADD https://github.com/Yelp/dumb-init/releases/download/v1.2.0/dumb-init_1.2.0_amd64 /usr/local/bin/dumb-init 21 | RUN chmod +x /usr/local/bin/dumb-init 22 | 23 | # Define required envvars 24 | ENV AzureWebJobsScriptRoot=/home/site/wwwroot 25 | 26 | # Specify the work dir and do a npm install 27 | WORKDIR /home/site/wwwroot 28 | RUN npm i puppeteer@1.8.0 -------------------------------------------------------------------------------- /LICENSE: -------------------------------------------------------------------------------- 1 | MIT License 2 | 3 | Copyright (c) 2018 Elio Struyf 4 | 5 | Permission is hereby granted, free of charge, to any person obtaining a copy 6 | of this software and associated documentation files (the "Software"), to deal 7 | in the Software without restriction, including without limitation the rights 8 | to use, copy, modify, merge, publish, distribute, sublicense, and/or sell 9 | copies of the Software, and to permit persons to whom the Software is 10 | furnished to do so, subject to the following conditions: 11 | 12 | The above copyright notice and this permission notice shall be included in all 13 | copies or substantial portions of the Software. 14 | 15 | THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR 16 | IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, 17 | FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE 18 | AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER 19 | LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, 20 | OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE 21 | SOFTWARE. 22 | -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 | # Azure Functions Docker image with support for Puppeteer 2 | 3 | [![Pulls from Docker Hub](https://img.shields.io/docker/pulls/estruyf/azure-function-node-puppeteer.svg)](https://hub.docker.com/r/estruyf/azure-function-node-puppeteer) [![Stars on Docker Hub](https://img.shields.io/docker/stars/estruyf/azure-function-node-puppeteer.svg)](https://hub.docker.com/r/estruyf/azure-function-node-puppeteer) 4 | 5 | ## Why use this image? 6 | 7 | You probably want to use Puppeteer in your Azure Function. This Docker image got you covered. 8 | 9 | ## Usage 10 | 11 | Initialize a new project for your Azure Functions: 12 | 13 | ``` 14 | func init --docker 15 | ``` 16 | 17 | Update the Dockerfile with the following contents: 18 | 19 | ``` 20 | FROM estruyf/azure-function-node-puppeteer 21 | 22 | COPY . /home/site/wwwroot 23 | ``` 24 | 25 | ## Using Puppeteer 26 | 27 | Once you create a new Azure Function, you can use it like this sample: 28 | 29 | ``` 30 | const puppeteer = require('puppeteer'); 31 | 32 | module.exports = async (context, req) => { 33 | const browser = await puppeteer.launch({ 34 | args: [ 35 | '--no-sandbox', 36 | '--disable-setuid-sandbox' 37 | ] 38 | }); 39 | 40 | const page = await browser.newPage(); 41 | await page.goto('https://www.eliostruyf.com'); 42 | const pageTitle = await page.title(); 43 | await browser.close(); 44 | 45 | context.res = { 46 | // status: 200, /* Defaults to 200 */ 47 | body: `Page title: ${pageTitle}` 48 | }; 49 | }; 50 | ``` --------------------------------------------------------------------------------