Docker部署Node.js+Playwright项目并实现浏览器截图、打印和下载功能

 更新时间:2025年10月31日 09:09:20   作者:代码怪兽大大作战  
在现代前端/自动化测试项目中,Playwright 常用于浏览器自动化操作,如截图、打印和下载 PDF,本文详细介绍如何在 Linux 环境下使用 Docker 部署 Node.js + Playwright 项目,并对 Dockerfile、docker-compose 和自动化部署脚本逐行解析,需要的朋友可以参考下

一、项目目录结构

假设项目目录为 /opt/test/front-node/,结构如下:

/opt/test/front-node/
├── node/
│   ├── src/                # Node.js 源码
│   ├── package.json
│   ├── pnpm-lock.yaml
│   ├── assets/             # 静态资源
│   └── test.js             # Playwright 测试脚本
├── Dockerfile              # Docker 镜像构建文件
├── docker-compose.yml      # Docker Compose 服务定义
└── deploy-node.sh          # 自动化部署脚本

说明:

  • node/ 文件夹包含完整 Node.js 应用
  • 其他文件用于 Docker 构建和部署

二、Dockerfile

2.1 完整 Dockerfile 内容

下面是完整的 Dockerfile:

# 基于官方 Node.js 镜像
FROM node:20-bullseye

LABEL authors="test"

# 设置非交互模式
ENV DEBIAN_FRONTEND=noninteractive

# 使用清华源 + 安装必要依赖(Playwright 运行时)
RUN sed -i 's|http://deb.debian.org/debian|https://mirrors.tuna.tsinghua.edu.cn/debian|g' /etc/apt/sources.list && \
    apt-get update && \
    apt-get install -y --no-install-recommends \
    libnss3 libnspr4 libatk1.0-0 libatk-bridge2.0-0 libcups2 \
    libdrm2 libxkbcommon0 libatspi2.0-0 libxcomposite1 libxdamage1 \
    libxfixes3 libxrandr2 libgbm1 libasound2 curl ca-certificates git \
    && rm -rf /var/lib/apt/lists/*

# 设置工作目录
WORKDIR /usr/src/app

# 先仅复制依赖声明文件,加快构建缓存
COPY node/package*.json ./

# 使用国内 npm 源
RUN npm config set registry https://registry.npmmirror.com/

# 切换目录安装依赖
WORKDIR /usr/src/app/node
RUN npm install --omit=dev --loglevel=error

# 复制完整项目代码(最后执行,避免频繁失效缓存)
COPY node ./

# 设置环境变量以通过 npm 安装浏览器
ENV PLAYWRIGHT_SKIP_BROWSER_DOWNLOAD=1

# 先安装依赖包
RUN npm install --omit=dev

# 再手动用 npm 装 chromium
RUN npx playwright install chromium --with-deps --force

# 暴露端口
EXPOSE 3001

# 启动命令
CMD ["npm", "run", "start"]

2.2 Dockerfile 详解

# 基于官方 Node.js 镜像
FROM node:20-bullseye
LABEL authors="test"

# 设置非交互模式,避免 apt-get 安装弹出交互界面
ENV DEBIAN_FRONTEND=noninteractive

# 使用清华源加速 Debian 包下载,同时安装 Playwright 运行依赖
RUN sed -i 's|http://deb.debian.org/debian|https://mirrors.tuna.tsinghua.edu.cn/debian|g' /etc/apt/sources.list && \
    apt-get update && \
    apt-get install -y --no-install-recommends \
    libnss3 libnspr4 libatk1.0-0 libatk-bridge2.0-0 libcups2 \
    libdrm2 libxkbcommon0 libatspi2.0-0 libxcomposite1 libxdamage1 \
    libxfixes3 libxrandr2 libgbm1 libasound2 curl ca-certificates git \
    && rm -rf /var/lib/apt/lists/*

解析

基础镜像node:20-bullseye

  • Node 20 官方 Debian 版本,体积适中,兼容 Playwright
  • 选择 Debian 而不是 Alpine,是因为 Playwright 对 Chromium 依赖较多,Alpine 缺少很多库容易报错

非交互模式ENV DEBIAN_FRONTEND=noninteractive

  • 避免 apt-get install 过程中弹出交互提示导致构建卡住

清华源加速sed -i 's|http://deb.debian.org/debian|https://mirrors.tuna.tsinghua.edu.cn/debian|g'

  • 国内访问 Debian 官方源慢,替换成清华镜像,加速依赖安装

安装 Chromium 运行依赖

  • Playwright 需要一些系统库,如 libnss3libatk1.0-0libcups2 等
  • --no-install-recommends 避免安装不必要的额外软件,减小镜像体积
# 设置工作目录
WORKDIR /usr/src/app

# 先复制依赖声明文件,加快 Docker 缓存
COPY node/package*.json ./

# 使用国内 npm 镜像
RUN npm config set registry https://registry.npmmirror.com/

解析

WORKDIR

  • 设置镜像工作目录,所有后续操作都在 /usr/src/app 进行

COPY package.json*

  • 先只复制依赖文件,不复制源码
  • 利用 Docker 缓存层,如果 package.json 未修改,npm install 不会重复执行

npm 镜像加速

  • 国内访问官方 npm registry 速度慢
  • 使用 registry.npmmirror.com 可以大幅加快依赖安装
# 切换目录安装依赖
WORKDIR /usr/src/app/node
RUN npm install --omit=dev --loglevel=error

解析

  • WORKDIR 切换到 node:保证依赖安装在项目源代码目录下
  • npm install --omit=dev:生产环境只安装必要依赖,不安装 devDependencies
  • –loglevel=error:减少构建日志输出
# 复制完整项目代码
COPY node ./ 

# 设置 Playwright 环境变量,跳过浏览器自动下载
ENV PLAYWRIGHT_SKIP_BROWSER_DOWNLOAD=1

# 再安装依赖
RUN npm install --omit=dev

# 手动安装 Chromium
RUN npx playwright install chromium --with-deps --force

解析

复制完整项目

  • 先安装依赖,再复制源码,可以利用 Docker 缓存,加快 rebuild

跳过自动下载浏览器

  • 避免 npm install playwright 时重复下载 Chromium,减少网络依赖

手动安装 Chromium

  • --with-deps 安装 Playwright 运行所需的所有系统依赖
  • --force 确保每次安装都是最新版本
# 暴露端口
EXPOSE 3001

# 启动命令
CMD ["npm", "run", "start"]

解析

  • EXPOSE 3001:容器对外暴露端口
  • CMD:容器启动时执行的命令,运行 Node.js 服务

三、docker-compose.yml 详解

version: "3.9"

services:
  front-node:
    build:
      context: .
      dockerfile: Dockerfile
    image: test-node:latest   # <-- 指定镜像名称
    container_name: test-node
    restart: always
    ports:
      - "3001:3001"
    environment:
      - NODE_ENV=production
    working_dir: /usr/src/app
    command: ["npm", "run", "start"]
    volumes:
      # 映射整个 node 项目文件夹
      - /opt/test/front-node/node:/usr/src/app
      # 防止 node_modules 被宿主机空目录覆盖
      - /usr/src/app/node_modules

解析

services.front-node

  • 定义 Node.js 服务

build.context / dockerfile

  • 指定 Dockerfile 和构建上下文

image / container_name

  • 镜像与容器命名,方便管理

restart: always

  • 容器异常退出自动重启

ports

  • 宿主机端口映射到容器端口

volumes

  • 映射宿主机代码目录,方便开发调试
  • 单独挂载 node_modules 防止空目录覆盖

四、自动化部署脚本 deploy-node.sh

#!/bin/bash

# 工作目录
WORKDIR="/opt/test/front-node"

# 容器和镜像名称
CONTAINER_NAME="test-node"
IMAGE_NAME="test-node:latest"

# 切换到工作目录
cd "$WORKDIR" || { echo "工作目录不存在: $WORKDIR"; exit 1; }

echo "=== 检查并停止容器 ${CONTAINER_NAME} ==="
if docker ps -a --format '{{.Names}}' | grep -w "${CONTAINER_NAME}" > /dev/null; then
    docker stop "${CONTAINER_NAME}"
    docker rm "${CONTAINER_NAME}"
    echo "容器 ${CONTAINER_NAME} 已停止并删除"
else
    echo "容器 ${CONTAINER_NAME} 不存在"
fi

echo "=== 删除镜像 ${IMAGE_NAME} ==="
if docker images --format '{{.Repository}}:{{.Tag}}' | grep -w "${IMAGE_NAME}" > /dev/null; then
    docker rmi "${IMAGE_NAME}" -f
    echo "镜像 ${IMAGE_NAME} 已删除"
else
    echo "镜像 ${IMAGE_NAME} 不存在"
fi

echo "=== 构建镜像并启动容器 ==="
docker compose build
docker compose up -d

echo "=== 完成 ==="


解析

  • 自动停止旧容器:避免端口冲突
  • 删除旧镜像:保证构建最新版本
  • docker compose build + up:构建镜像并启动容器
  • 一键部署:Linux 下快速上线

五、Playwright 浏览器截图/打印示例

const { chromium } = require('playwright');

(async () => {
  const browser = await chromium.launch();
  const page = await browser.newPage();
  await page.goto('https://example.com');

  // 截图
  await page.screenshot({ path: 'example.png' });

  // 打印 PDF
  await page.pdf({ path: 'example.pdf', format: 'A4' });

  await browser.close();
})();

解析

  • chromium.launch():启动浏览器实例
  • page.goto():访问页面
  • page.screenshot() / page.pdf():实现截图和打印功能
  • 支持自动化生成报告、文件下载等操作

六、优化建议

国内加速源

  • Debian 清华源 + npm 镜像
  • 显著提升构建速度

缓存依赖

  • 先复制 package*.json 再安装依赖
  • 再复制源码,减少重复构建

非 root 用户运行

  • 提升安全性

分阶段构建(可选)

  • 构建阶段安装 Playwright
  • 生产阶段只复制 Node + 依赖
  • 镜像更小,启动更快

七、总结

在 Linux 使用 Docker 部署 Node.js + Playwright 项目 的方案,涵盖:

  • Dockerfile 构建 Playwright 所需环境
  • docker-compose 服务配置
  • 自动化部署脚本
  • 浏览器截图与打印示例

通过上述方法,可以快速在国内 Linux 环境部署 Playwright 项目,并支持截图、打印和下载等自动化操作。

以上就是Docker部署Node.js+Playwright项目并实现浏览器截图、打印和下载功能的详细内容,更多关于Docker部署Node.js+Playwright项目的资料请关注脚本之家其它相关文章!

相关文章

  • harbor仓库搭建全过程(配置https)

    harbor仓库搭建全过程(配置https)

    需安装Docker及Docker Compose,Harbor版本需匹配,因密码加密算法升级至SHA1,需配置HTTPS以避免登录错误,步骤包括生成CA证书、修改配置、启动仓库、访问地址及数据库调整加密算法,最后设置开机自启
    2025-09-09
  • Docker网段和内网网段ip冲突导致无法访问网络的两种解决方法

    Docker网段和内网网段ip冲突导致无法访问网络的两种解决方法

    本文主要介绍了Docker网段和内网网段冲突导致无法访问网络的两种解决方法,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2023-06-06
  • Docker给容器添加新端口映射两种方法及常用命令

    Docker给容器添加新端口映射两种方法及常用命令

    在使用Docker时容器的端口映射是一个核心概念,它允许容器与宿主机以及外部网络进行通信,这篇文章主要给大家介绍了关于Docker给容器添加新端口映射两种方法及常用命令的相关资料,需要的朋友可以参考下
    2024-07-07
  • docker实现buildx构建多平台(x86,arm64)构架镜像

    docker实现buildx构建多平台(x86,arm64)构架镜像

    这篇文章主要介绍了docker实现buildx构建多平台(x86,arm64)构架镜像,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教
    2025-09-09
  • docker启动mysql5.7服务详细说明

    docker启动mysql5.7服务详细说明

    这篇文章主要给大家介绍了关于docker启动mysql5.7服务的相关资料,文中通过代码示例介绍的非常详细,对大家的学习或者工作具有一定的参考价值,需要的朋友可以参考下
    2023-09-09
  • Docker 容器文件系统详细介绍(图文)

    Docker 容器文件系统详细介绍(图文)

    这篇文章主要介绍了Docker 容器文件系统详细介绍(图文)的相关资料,这里对Docker 容器文件系统进行了具体的分析详解,需要的朋友可以参考下
    2016-12-12
  • 快速设置Docker的三种网络代理配置方式

    快速设置Docker的三种网络代理配置方式

    这篇文章主要介绍了快速设置Docker的三种网络代理配置方式,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教
    2025-04-04
  • docker实现MySQL的主从复制

    docker实现MySQL的主从复制

    在学习项目的时候实现读写分离用到了主从复制,但是一般要实现的话需要虚拟机或服务器非常麻烦,但是docker可以完美解决这一问题,本文主要介绍了docker实现MySQL的主从复制,感兴趣的可以了解一下
    2024-01-01
  • Docker管理面板SimpleDocker的具体使用

    Docker管理面板SimpleDocker的具体使用

    SimpleDocker 是一个简单的Docker控制面板,本文主要介绍了Docker管理面板SimpleDocker的具体使用,文中通过示例代码介绍的非常详细,需要的朋友们下面随着小编来一起学习学习吧
    2023-08-08
  • docker 查看容器日志命令的实现

    docker 查看容器日志命令的实现

    这篇文章主要介绍了docker 查看容器日志命令的实现,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2020-12-12

最新评论