Docker中运行Playwright-Java抛出Failed to create driver异常求助
解决Playwright-Java在Docker容器中启动失败的问题
问题背景
在Java/Spring项目中集成Playwright-Java后,使用官方提供的mcr.microsoft.com/playwright/java:v1.35.0-jammy-amd64镜像构建Docker容器,应用启动时抛出BeanCreationException,根源为Playwright无法创建驱动——具体表现为无法执行临时目录中的playwright.sh脚本,报错Failed to exec spawn helper: pid: 36, exit value: 1。
异常日志详情
org.springframework.beans.factory.BeanCreationException: Error creating bean with name 'playwrightPdfConverterService': Invocation of init method failed; nested exception is java.lang.RuntimeException: Failed to create driver ... Caused by: java.io.IOException: error=0, Failed to exec spawn helper: pid: 36, exit value: 1 ...
相关代码与配置
Playwright初始化代码
@PostConstruct void init(){ LOGGER.info("Initializinig Playwright with Chromium ..."); Playwright playwright = Playwright.create(); browser = playwright.chromium().launch(); // Page.pdf only supported in headless Chromium }
Dockerfile内容
FROM mcr.microsoft.com/playwright/java:v1.35.0-jammy-amd64 # Ubuntu 22.04-based image with java 17, mvn 3.8.8 # and chromium-1064 ffmpeg-1009 firefox-1408 webkit-1848 WORKDIR /opt ARG JAR_FILE=target/*.jar COPY ${JAR_FILE} ./company-pdf-service.jar EXPOSE 8300 ENTRYPOINT ["java","-jar","./company-pdf-service.jar"]
解决办法
方案1:调整Java启动参数,修复Spawn Helper问题
Java 17及以上版本默认使用posix_spawn作为进程启动机制,部分环境下会触发Spawn Helper执行失败。在Java启动命令中添加-Djdk.lang.Process.launchMechanism=vfork参数即可绕过该问题:
修改Dockerfile的ENTRYPOINT:
ENTRYPOINT ["java","-Djdk.lang.Process.launchMechanism=vfork","-jar","./company-pdf-service.jar"]
方案2:显式指定镜像预装的浏览器路径
官方Playwright镜像已预装对应版本的浏览器,无需Playwright自动下载。显式指定浏览器可执行文件路径,避免临时目录权限问题:
修改Playwright初始化代码:
import java.nio.file.Paths; // ... @PostConstruct void init(){ LOGGER.info("Initializinig Playwright with Chromium ..."); Playwright playwright = Playwright.create(); BrowserType chromium = playwright.chromium(); // 路径对应镜像中预装的Chromium版本,需与镜像标签匹配 browser = chromium.launch(new BrowserType.LaunchOptions() .setExecutablePath(Paths.get("/ms-playwright/chromium-1064/chrome-linux/chrome"))); }
方案3:修复临时目录权限
如果是/tmp目录权限不足导致脚本无法执行,可在Dockerfile中添加权限配置:
RUN chmod 777 /tmp
内容的提问来源于stack exchange,提问作者Paul Verest on LinkedIn
相关产品推荐
相关产品推荐

