docker

关注公众号 jb51net

关闭
首页 > 网站技巧 > 服务器 > 云和虚拟化 > docker > Docker部署Node.js+Playwright项目

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

作者:代码怪兽大大作战

在现代前端/自动化测试项目中,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          # 自动化部署脚本

说明:

二、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

非交互模式ENV DEBIAN_FRONTEND=noninteractive

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

安装 Chromium 运行依赖

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

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

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

解析

WORKDIR

COPY package.json*

npm 镜像加速

# 切换目录安装依赖
WORKDIR /usr/src/app/node
RUN npm install --omit=dev --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

解析

复制完整项目

跳过自动下载浏览器

手动安装 Chromium

# 暴露端口
EXPOSE 3001

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

解析

三、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

build.context / dockerfile

image / container_name

restart: always

ports

volumes

四、自动化部署脚本 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 "=== 完成 ==="


解析

五、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();
})();

解析

六、优化建议

国内加速源

缓存依赖

非 root 用户运行

分阶段构建(可选)

七、总结

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

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

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

您可能感兴趣的文章:
阅读全文