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镜像,但有两个疑问:
- 该镜像未说明Java版本,也无多版本可选,仅能指定Playwright版本,是否为固定Java版本?
- 文档指出该镜像仅用于测试开发,不能用于生产环境,那生产环境的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
相关产品推荐
相关产品推荐

