Docker Alpine环境运行Golang Rod报错找不到chrome-linux/chrome文件
根本原因
rod默认会自动下载适配glibc生态的预编译Chromium二进制文件,Alpine Linux采用musl libc作为系统C库,二者不兼容。即使你已在Alpine内安装源里的Chromium,rod仍会默认调用自己下载的不兼容二进制,动态链接阶段无法找到对应依赖就会抛出no such file or directory错误。
解决方案
可按以下任意一种方案修改:
- 方案一:修改Go代码,明确指定Alpine预装Chromium的路径,禁止rod自动下载
修改启动代码如下:
l, _ := launcher.New(). Bin("/usr/bin/chromium-browser"). // 指定Alpine源安装的Chromium路径 Set("disable-web-security"). Set("disable-setuid-sandbox"). Set("no-sandbox"). Set("no-first-run", "true"). Set("disable-gpu"). Headless(true). Launch() browser := rod.New().ControlURL(l).MustConnect()
- 方案二:无需修改代码,在Dockerfile中添加rod专属环境变量即可生效
在Alpine镜像阶段新增环境变量配置:
ENV ROD_SKIP_DOWNLOAD=true \ ROD_BIN=/usr/bin/chromium-browser
Dockerfile优化建议
同步调整Alpine阶段的依赖安装逻辑,补全Chromium运行所需的基础依赖,避免后续出现页面乱码、进程异常退出问题:
FROM alpine:latest RUN sed -i 's/dl-cdn.alpinelinux.org/mirrors.aliyun.com/g' /etc/apk/repositories && \ apk update && \ apk upgrade && \ apk add --no-cache chromium tzdata dumb-init font-noto-cjk && \ rm -rf /var/cache/apk/* # 方案二的环境变量加在这里即可 # ENV ROD_SKIP_DOWNLOAD=true \ # ROD_BIN=/usr/bin/chromium-browser WORKDIR /root/ COPY --from=builder /app ./ COPY /configs ./configs ENTRYPOINT ["/usr/bin/dumb-init", "--"] CMD ["./app"]
验证方法
构建镜像后可先进入容器执行/usr/bin/chromium-browser --version,若能正常输出版本号则说明Chromium安装正常,再启动业务程序即可正常运行。
内容的提问来源于stack exchange,提问作者Todd
相关产品推荐
相关产品推荐

