Docker构建Selenium运行镜像后运行报错chromedriver退出状态码127
核心问题定位
Status code: 127是Linux系统层面的报错,含义为可执行文件依赖缺失/无执行权限,该报错和你本地Mac Catalina的操作系统完全无关:Docker在Mac上运行容器是通过内置轻量虚拟机承载的标准x86 Linux隔离环境,容器内的依赖缺口不会因为更换宿主机(哪怕换到远程Linux主机)就自动修复,问题全部出在当前Dockerfile的配置逻辑漏洞上。
当前Dockerfile存在的具体问题
- 系统源更新逻辑顺序错误:你将
RUN apt-get update放置在Chromedriver安装步骤之后,前面安装Chrome deb包、参考技术方案补系统依赖时,apt源列表根本没完成更新,就算触发apt-get install -yf的依赖修复逻辑,也因为没有有效源拉不到缺失的系统库,直接导致Chrome、Chromedriver启动时找不到依赖抛127,这也是之前参考公开解决方案修复无效的核心原因。 - Chrome系统依赖安装不全:仅靠
dpkg -i加强制修复的方式,没有显式安装Chrome运行必需的系统依赖,包括但不限于libnss3、libatk1.0-0、libatk-bridge2.0-0、libcups2、libdrm2、libxkbcommon0、libxcomposite1、libxdamage1、libxfixes3、libxrandr2、libgbm1、libpango-1.0-0、libcairo2、libasound2。 - Chromedriver执行权限缺失:解压完成的Chromedriver没有添加可执行权限,默认解压出的二进制文件没有可执行位,调用时会直接报执行失败。
- 版本匹配隐患:你安装的是
google-chrome-stable最新正式版,但锁死了Chromedriver 89的老旧版本,二者大版本差超过10个,就算依赖补全,后续也会触发版本不兼容的启动失败。 - 清理动作时序错误:安装完Chrome deb包后立刻删除安装包,后续如果要补依赖没有兜底安装源。
修正后的可正常运行的Dockerfile
FROM python:3.7 WORKDIR /opt # 先更新apt源,安装基础工具与Chrome运行必需的系统依赖 RUN apt-get update && apt-get install -y --no-install-recommends \ curl \ wget \ unzip \ apt-transport-https \ ca-certificates \ libnss3 \ libatk1.0-0 \ libatk-bridge2.0-0 \ libcups2 \ libdrm2 \ libxkbcommon0 \ libxcomposite1 \ libxdamage1 \ libxfixes3 \ libxrandr2 \ libgbm1 \ libpango-1.0-0 \ libcairo2 \ libasound2 \ && rm -rf /var/lib/apt/lists/* # 安装Chrome稳定版 RUN curl https://dl.google.com/linux/direct/google-chrome-stable_current_amd64.deb -o /chrome.deb \ && dpkg -i /chrome.deb || apt-get install -yf \ && rm /chrome.deb # 安装与当前Chrome版本匹配的Chromedriver ENV CHROMEDRIVER_DIR /chromedriver ENV CHROMEDRIVER_VERSION 89.0.4389.23 RUN mkdir -p $CHROMEDRIVER_DIR \ && wget -q --continue -P $CHROMEDRIVER_DIR "http://chromedriver.storage.googleapis.com/$CHROMEDRIVER_VERSION/chromedriver_linux64.zip" \ && unzip $CHROMEDRIVER_DIR/chromedriver* -d $CHROMEDRIVER_DIR \ # 给Chromedriver添加可执行权限 && chmod +x $CHROMEDRIVER_DIR/chromedriver ENV PATH $CHROMEDRIVER_DIR:$PATH COPY . . RUN pip3 install --no-cache-dir -r requirements.txt CMD ["python3","code.py"]
排查验证方法
如果修正后仍有报错,可以进入运行失败的容器手动执行chromedriver --version,终端会直接打印具体缺失的依赖库名称,按照提示补装对应包即可。
内容的提问来源于stack exchange,提问作者Deepak Sharma
相关产品推荐
相关产品推荐

