You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何将Playwright集成到Docker化的Spring Java应用中?

问题:在Spring应用Docker镜像中集成Playwright 1.40.0实现PDF导出

现有一个通过Tilt运行的Spring应用,其Dockerfile如下:

FROM amazoncorretto:21-alpine-jdk AS builder
# Install "entr" package using apk package manager
RUN apk update && \
    apk add entr
FROM public.ecr.aws/amazoncorretto/amazoncorretto:21
COPY --from=builder /lib/ld-musl-aarch64.so.1 /lib/ld-musl-aarch64.so.1
COPY --from=builder /usr/bin/entr /usr/bin/entr
ENV MAIN_OPTS ''
RUN yum install -y tar && mkdir -p /opt/demo/
ADD BOOT-INF/lib /opt/demo/lib
ADD META-INF /opt/demo/META-INF
ADD BOOT-INF/classes /opt/demo
WORKDIR /opt/demo/
ENTRYPOINT java $JAVA_OPTS -agentlib:jdwp=transport=dt_socket,server=y,suspend=n,address=*:5013 -cp .:./lib/* io.demo.DemoApplication $MAIN_OPTS
EXPOSE 8080

需求是使用Playwright 1.40.0版本的无头浏览器实现网站PDF导出,已添加ENV PLAYWRIGHT_SKIP_BROWSER_DOWNLOAD 1避免自动下载浏览器,但尝试引入以下Playwright镜像均失败:

FROM mcr.microsoft.com/playwright/java:v1.40.0-jammy as playwright

FROM apify/actor-node-playwright:16

FROM mcr.microsoft.com/playwright/python:v1.40.0-focal

出现的错误包括:

entr: exec java: No such file or directory

failed to install browsers

failed to create driver

仅添加跳过浏览器下载的环境变量时,会出现:

Failed to read message from driver, pipe closed

需要在现有构建基础上编写多阶段Dockerfile,使镜像包含Playwright(注:并非用于测试)。


解决方案

以下是调整后的多阶段Dockerfile,解决依赖缺失和环境不兼容的问题:

# 阶段1:构建Spring应用并安装entr
FROM amazoncorretto:21-alpine-jdk AS builder
RUN apk update && apk add entr

# 阶段2:获取Playwright Java环境及预安装的浏览器
FROM mcr.microsoft.com/playwright/java:v1.40.0-jammy AS playwright

# 阶段3:最终镜像,基于Amazon Corretto 21,整合Playwright和Spring应用
FROM public.ecr.aws/amazoncorretto/amazoncorretto:21

# 复制builder阶段的entr依赖
COPY --from=builder /lib/ld-musl-aarch64.so.1 /lib/ld-musl-aarch64.so.1
COPY --from=builder /usr/bin/entr /usr/bin/entr

# 复制Playwright的驱动、浏览器及依赖库
COPY --from=playwright /root/.cache/ms-playwright /root/.cache/ms-playwright
COPY --from=playwright /opt/java/openjdk/lib/amd64/libplaywright.so /opt/java/openjdk/lib/amd64/libplaywright.so

# 安装Playwright运行所需的系统依赖(适配Corretto 21的RHEL基础镜像)
RUN yum install -y tar gtk3 atk libX11 libXcomposite libXcursor libXdamage libXext libXi libXrandr libXrender libXtst pango alsa-lib cups-libs dbus-glib && \
    yum clean all

# 设置Playwright环境变量,指定浏览器缓存路径
ENV PLAYWRIGHT_BROWSERS_PATH=/root/.cache/ms-playwright
ENV PLAYWRIGHT_SKIP_BROWSER_DOWNLOAD=1

# Spring应用相关配置
ENV MAIN_OPTS ''
RUN mkdir -p /opt/demo/
ADD BOOT-INF/lib /opt/demo/lib
ADD META-INF /opt/demo/META-INF
ADD BOOT-INF/classes /opt/demo
WORKDIR /opt/demo/

ENTRYPOINT java $JAVA_OPTS -agentlib:jdwp=transport=dt_socket,server=y,suspend=n,address=*:5013 -cp .:./lib/* io.demo.DemoApplication $MAIN_OPTS
EXPOSE 8080

关键步骤说明:

  • 匹配Playwright镜像类型:选用mcr.microsoft.com/playwright/java:v1.40.0-jammy作为Playwright阶段,该镜像预安装了对应版本的Java版Playwright驱动、浏览器及系统依赖,与Spring应用的Java环境完全兼容。
  • 复用预下载资源:将Playwright镜像中已下载的浏览器缓存和本地驱动库复制到最终镜像,避免运行时重复下载或依赖缺失。
  • 补充系统依赖:针对Corretto 21的RHEL基础镜像,安装Playwright无头模式必需的GTK、X11等图形依赖库,否则会出现驱动启动失败。
  • 明确环境变量:通过PLAYWRIGHT_BROWSERS_PATH指定预安装浏览器的位置,确保Playwright能正确找到浏览器资源。

额外排查点:

  • 如果仍出现failed to create driver,可在JAVA_OPTS中添加-Djava.library.path=/opt/java/openjdk/lib/amd64,强制Java加载指定路径下的Playwright本地库。
  • 确认Spring应用的依赖中已包含com.microsoft.playwright:playwright:1.40.0,若未打包到应用lib目录,需在Dockerfile中补充复制Playwright的Java依赖包。

内容的提问来源于stack exchange,提问作者Liron Tal

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.03 10:52:47