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

Quarkus服务部署Docker时Playwright依赖缺失问题咨询

Java Playwright + Quarkus 部署Docker依赖问题

问题描述

我有一个使用Java版Playwright库进行网页抓取的Quarkus服务,在Windows主机本地运行正常,但部署到openjdk:17.0.1-jdk-slimDocker镜像后,执行Playwright代码时出现依赖缺失错误:

com.microsoft.playwright.PlaywrightException: Error {
quarkus-service  |   message='
quarkus-service  | ╔══════════════════════════════════════════════════════╗
quarkus-service  | ║ Host system is missing dependencies to run browsers. ║
quarkus-service  | ║ Missing libraries:                                   ║
quarkus-service  | ║     libsoup-2.4.so.1                                 ║
quarkus-service  | ║     libgstreamer-1.0.so.0                            ║
quarkus-service  | ║     libgtk-3.so.0                                    ║
quarkus-service  | ║     libgdk-3.so.0                                    ║
quarkus-service  | ║     libcairo.so.2                                    ║
quarkus-service  | ║     libepoxy.so.0                                    ║
quarkus-service  | ║     libevent-2.1.so.7                                ║
quarkus-service  | ║     libopus.so.0                                     ║
quarkus-service  | ║     libicui18n.so.67                                 ║
quarkus-service  | ║     libicuuc.so.67                                   ║
quarkus-service  | ║     libpango-1.0.so.0                                ║
quarkus-service  | ║     libharfbuzz.so.0                                 ║
quarkus-service  | ║     libgdk_pixbuf-2.0.so.0                           ║
quarkus-service  | ║     libxml2.so.2                                     ║
quarkus-service  | ║     libsqlite3.so.0                                  ║
quarkus-service  | ║     libxslt.so.1                                     ║
quarkus-service  | ║     liblcms2.so.2                                    ║
quarkus-service  | ║     libwoff2dec.so.1.0.2                             ║
quarkus-service  | ║     libfontconfig.so.1                               ║
quarkus-service  | ║     libfreetype.so.6                                 ║
quarkus-service  | ║     libharfbuzz-icu.so.0                             ║
quarkus-service  | ║     libgstallocators-1.0.so.0                        ║
quarkus-service  | ║     libgstapp-1.0.so.0                               ║
quarkus-service  | ║     libgstbase-1.0.so.0                              ║
quarkus-service  | ║     libgstpbutils-1.0.so.0                           ║
quarkus-service  | ║     libgstaudio-1.0.so.0                             ║
quarkus-service  | ║     libgsttag-1.0.so.0                               ║
quarkus-service  | ║     libgstvideo-1.0.so.0                             ║
quarkus-service  | ║     libgstgl-1.0.so.0                                ║
quarkus-service  | ║     libgstfft-1.0.so.0                               ║
quarkus-service  | ║     libjpeg.so.62                                    ║
quarkus-service  | ║     libpng16.so.16                                   ║
quarkus-service  | ║     libopenjp2.so.7                                  ║
quarkus-service  | ║     libwebpdemux.so.2                                ║
quarkus-service  | ║     libwebp.so.6                                     ║
quarkus-service  | ║     libenchant-2.so.2                                ║
quarkus-service  | ║     libsecret-1.so.0                                 ║
quarkus-service  | ║     libhyphen.so.0                                   ║
quarkus-service  | ║     libX11.so.6                                      ║
quarkus-service  | ║     libXcomposite.so.1                               ║
quarkus-service  | ║     libXdamage.so.1                                  ║
quarkus-service  | ║     libwayland-server.so.0                           ║
quarkus-service  | ║     libwayland-egl.so.1                              ║
quarkus-service  | ║     libwayland-client.so.0                           ║
quarkus-service  | ║     libmanette-0.2.so.0                              ║
quarkus-service  | ║     libgbm.so.1                                      ║
quarkus-service  | ║     libdrm.so.2                                      ║
quarkus-service  | ║     libatomic.so.1                                   ║
quarkus-service  | ║     libxkbcommon.so.0                                ║
quarkus-service  | ║     libdbus-1.so.3                                   ║
quarkus-service  | ║     libGLESv2.so.2                                   ║
quarkus-service  | ║     libx264.so                                       ║
quarkus-service  | ╚══════════════════════════════════════════════════════╝

NodeJS版Playwright可通过NPM安装依赖,但Java版没有对应工具,手动用apt-get install安装依赖也无法解析。之后发现Java版Playwright有官方Docker镜像,但有两个疑问:

  1. 该镜像未说明Java版本,也无多版本可选,仅能指定Playwright版本,是否为固定Java版本?
  2. 文档指出该镜像仅用于测试开发,不能用于生产环境,那生产环境的Docker镜像应如何配置?是否需基于Ubuntu镜像安装所需Java版本及全部依赖?

解答

1. 官方Java Playwright镜像的Java版本问题

官方Java Playwright镜像的Java版本是与Playwright版本绑定的:

  • Playwright v1.xx早期版本通常对应OpenJDK 11
  • v1.30及以上版本升级为OpenJDK 17

你可以通过运行docker run --rm microsoft-playwright-java:<version> java -version命令查看具体版本。如果你的Quarkus服务需要特定Java版本,官方镜像可能无法满足,建议自行构建镜像。

2. 生产环境Docker镜像配置方案

官方镜像不适合生产是因为它包含大量测试工具和冗余依赖,体积偏大。生产环境可以基于Ubuntu或Debian镜像,手动安装所需依赖+指定Java版本,具体方案如下:

方案一:基于Ubuntu构建生产镜像(推荐)

Ubuntu的软件源能完整覆盖Playwright所需依赖,构建步骤清晰:

# 基础镜像选择Ubuntu 22.04
FROM ubuntu:22.04

# 避免交互模式提示
ENV DEBIAN_FRONTEND=noninteractive
ENV JAVA_HOME=/usr/lib/jvm/java-17-openjdk-amd64

# 安装OpenJDK 17和Playwright核心依赖
RUN apt-get update && \
    apt-get install -y --no-install-recommends \
        openjdk-17-jdk \
        libgtk-3-0 \
        libgbm-dev \
        libnss3 \
        libxss1 \
        libasound2 \
        libxtst6 \
        fonts-freefont-ttf \
        && rm -rf /var/lib/apt/lists/*

# 预下载Playwright浏览器(如果你的代码未自动处理)
RUN mkdir -p /root/.cache/ms-playwright && \
    cd /root/.cache/ms-playwright && \
    wget -q https://playwright.azureedge.net/builds/chromium/1071/chromium-linux.zip && \
    unzip chromium-linux.zip && rm chromium-linux.zip && \
    wget -q https://playwright.azureedge.net/builds/firefox/1494/firefox-linux.zip && \
    unzip firefox-linux.zip && rm firefox-linux.zip && \
    wget -q https://playwright.azureedge.net/builds/webkit/1894/webkit-linux.zip && \
    unzip webkit-linux.zip && rm webkit-linux.zip

# 复制Quarkus服务构建产物
COPY target/quarkus-app /app

# 启动服务
CMD ["java", "-jar", "/app/quarkus-run.jar"]

方案二:多阶段构建优化镜像体积

通过多阶段构建分离编译和运行环境,进一步减小最终镜像体积:

# 第一阶段:编译Quarkus服务
FROM maven:3.8.6-openjdk-17 AS builder
COPY src /usr/src/app/src
COPY pom.xml /usr/src/app
RUN mvn -f /usr/src/app/pom.xml clean package -DskipTests

# 第二阶段:生产运行环境
FROM ubuntu:22.04
ENV DEBIAN_FRONTEND=noninteractive
ENV JAVA_HOME=/usr/lib/jvm/java-17-openjdk-amd64
RUN apt-get update && \
    apt-get install -y --no-install-recommends \
        openjdk-17-jdk \
        libgtk-3-0 \
        libgbm-dev \
        libnss3 \
        libxss1 \
        libasound2 \
        libxtst6 \
        fonts-freefont-ttf \
        && rm -rf /var/lib/apt/lists/*

# 从编译阶段复制产物
COPY --from=builder /usr/src/app/target/quarkus-app /app

CMD ["java", "-jar", "/app/quarkus-run.jar"]

额外注意事项

  • 生产环境必须启用Playwright无头模式:browserType.launch(new BrowserType.LaunchOptions().setHeadless(true)),减少资源占用
  • 不建议使用openjdk:17.0.1-jdk-slim这类裁剪镜像,其软件源缺失部分依赖,手动补全过程繁琐且易出问题

内容的提问来源于stack exchange,提问作者Furious Gamer

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.30 22:24:21