搭载M2芯片的Mac上Docker容器中Chrome启动失败的E2E测试问题
在M2芯片Mac的Docker容器中运行E2E测试时Chrome崩溃的问题
错误信息
* (MatchError) no match of right hand side value: {:error, "unknown error: Chrome failed to start: crashed. (unknown error: DevToolsActivePort file doesn't exist) (The process started from chrome location /usr/bin/google-chrome is no longer running, so ChromeDriver is assuming that Chrome has crashed.) (Driver info: chromedriver=114.0.5735.90,platform=Linux 6.4.16-linuxkit x86_64)"}
Dockerfile.localdev相关内容
# Node.js, npm, and yarn installation RUN curl -fsSL https://nodejs.org/dist/v${NODE_VERSION}/node-v${NODE_VERSION}-linux-x64.tar.xz | tar -xJv -C /usr/local --strip-components=1 --no-same-owner && \ ln -s /usr/local/bin/node /usr/local/bin/nodejs && \ npm install -g npm@${NPM_VERSION} && \ npm install -g yarn@${YARN_VERSION} # Chrome headless for running browser tests RUN yum -y install liberation-* && \ yum -y install https://dl.google.com/linux/direct/google-chrome-stable_current_x86_64.rpm && \ LATEST_CHROMEDRIVER_VERSION="$(curl -s https://chromedriver.storage.googleapis.com/LATEST_RELEASE)" && \ wget https://chromedriver.storage.googleapis.com/$LATEST_CHROMEDRIVER_VERSION/chromedriver_linux64.zip && \ unzip chromedriver_linux64.zip -d /usr/local/bin && \ rm chromedriver_linux64.zip
环境信息
- 宿主机:搭载M2芯片的Mac
- Docker容器系统:Amazon Linux 2
- Node版本:16.17.0
- Chrome版本:最新稳定版
- ChromeDriver版本:114.0.5735.90
已尝试操作
- 更换Chrome和ChromeDriver版本,问题未解决
- 测试在GitLab CI/CD流水线可正常运行,但本地持续失败
解决方案
1. 处理ARM架构兼容问题
M2为ARM64架构,当前安装的是x86_64版本Chrome,Docker在ARM Mac上运行x86容器需依赖Rosetta模拟,易出现稳定性问题,可二选一调整:
- 打开Docker Desktop设置,进入「Features in development」勾选
Use Rosetta for x86/amd64 emulation on Apple Silicon - 改用ARM版本Chrome,替换Dockerfile中Chrome安装逻辑:
同步替换ChromeDriver下载链接为ARM版本:RUN yum -y install liberation-* && \ curl -LO https://dl.google.com/linux/direct/google-chrome-stable_current_aarch64.rpm && \ yum -y install ./google-chrome-stable_current_aarch64.rpm && \ rm google-chrome-stable_current_aarch64.rpmwget https://chromedriver.storage.googleapis.com/$LATEST_CHROMEDRIVER_VERSION/chromedriver_linux_arm64.zip
2. 添加Chrome无头模式必备启动参数
在E2E测试的浏览器配置中添加以下参数(以Playwright为例,其他框架逻辑一致):
const browser = await chromium.launch({ headless: true, args: [ '--no-sandbox', '--disable-dev-shm-usage', '--disable-gpu', '--remote-debugging-port=9222', '--headless=new' ] });
参数作用:
--no-sandbox:容器环境下Chrome无法启用沙箱,必须关闭--disable-dev-shm-usage:避免容器共享内存不足导致崩溃--remote-debugging-port:强制指定调试端口,解决DevToolsActivePort文件缺失问题
3. 调整容器运行权限
避免以root用户运行Chrome,可在Dockerfile中创建普通用户:
RUN useradd -m testuser USER testuser
或运行容器时指定用户:
docker run --user 1000:1000 [你的镜像名]
4. 确保ChromeDriver与Chrome版本严格匹配
不要盲目拉取最新Driver,改为获取当前安装Chrome对应的版本:
# 替换原ChromeDriver安装代码 RUN CHROME_VERSION=$(google-chrome --version | grep -oP '\d+\.\d+\.\d+\.\d+') && \ CHROMEDRIVER_VERSION=$(curl -s https://chromedriver.storage.googleapis.com/LATEST_RELEASE_${CHROME_VERSION%.*}) && \ wget https://chromedriver.storage.googleapis.com/$CHROMEDRIVER_VERSION/chromedriver_linux64.zip && \ unzip chromedriver_linux64.zip -d /usr/local/bin && \ rm chromedriver_linux64.zip
内容的提问来源于stack exchange,提问作者klixo
相关产品推荐
相关产品推荐

