Go集成chromedp构建Docker镜像提示找不到google-chrome执行文件求助
错误原因
你当前的Dockerfile多阶段构建逻辑存在冗余且缺失依赖的问题:中间声明的chromedp/headless-shell:latest阶段没有被后续部署阶段引用,最终运行容器使用的gcr.io/distroless/base-debian11镜像仅包含你编译好的Go二进制程序,完全没有chromedp运行必需的Chrome浏览器可执行文件及相关依赖,因此触发了可执行文件未找到的报错。
修正方案
提供两种常用的可用配置,可根据自身需求选择:
方案1:以chromedp/headless-shell作为运行基础镜像(推荐)
该镜像已经预装了完整的headless Chrome运行环境,无需额外配置依赖,兼容性最高:
# syntax=docker/dockerfile:1 ## ## Build ## FROM golang:1.17-bullseye as build WORKDIR /app COPY . ./ RUN go mod download COPY *.go ./ RUN go build -o /docker-scraper ## ## Deploy ## FROM chromedp/headless-shell:latest WORKDIR / # 从构建阶段复制编译好的Go二进制 COPY --from=build /docker-scraper /docker-scraper EXPOSE 8080 # 若需要使用非root用户运行,可自行在该阶段创建用户并配置权限 ENTRYPOINT ["/docker-scraper"]
方案2:将Chrome依赖复制到distroless镜像
如果需要坚持使用distroless作为运行基础,需要手动提取chromedp镜像中的Chrome相关文件到部署阶段:
# syntax=docker/dockerfile:1 ## ## Build ## FROM golang:1.17-bullseye as build WORKDIR /app COPY . ./ RUN go mod download COPY *.go ./ RUN go build -o /docker-scraper ## ## 提取Chrome依赖 ## FROM chromedp/headless-shell:latest as chrome ## ## Deploy ## FROM gcr.io/distroless/base-debian11 WORKDIR / # 复制Go二进制 COPY --from=build /docker-scraper /docker-scraper # 复制完整的Chrome运行文件 COPY --from=chrome /headless-shell/ /headless-shell/ # 把Chrome路径加入系统环境变量 ENV PATH="/headless-shell:${PATH}" EXPOSE 8080 USER nonroot:nonroot ENTRYPOINT ["/docker-scraper"]
注意事项
- 使用方案2时,需要确认chromedp启动参数匹配headless-shell的运行要求,如遇沙箱权限报错可临时添加
--no-sandbox参数测试,生产环境建议优先调整容器运行权限满足沙箱安全要求。
内容的提问来源于stack exchange,提问作者Tomas
相关产品推荐
相关产品推荐

