调用AWS Lambda容器镜像时进程退出返回错误码100问题求助
你遇到的问题不是权限错误,核心是两个Lambda运行环境和本地Docker运行环境的差异导致Chrome启动失败,进而ChromeDriver无法创建有效会话:
- 本地测试Docker镜像时默认使用root用户运行,而AWS Lambda运行容器时默认使用无root权限的普通用户,Chrome默认会将缓存、用户配置写入
/root目录,普通用户无访问权限,导致Chrome启动崩溃。 - 你没有固定Chrome与ChromeDriver的版本匹配,webdriver-manager自动拉取的版本可能和你安装的Chrome版本不兼容。
解决方案
第一步:修改Protractor配置
在conf.js的chromeOptions.args中新增以下参数,指定Chrome所有写入路径都到Lambda唯一可写的/tmp目录,同时明确ChromeDriver路径避免查找错误:
exports.config = { directConnect: true, ignoreUncaughtExceptions: true, SELENIUM_PROMISE_MANAGER: false, 'specs': ['index.js'], jasmineNodeOpts: { // 建议调整超时时间到15秒,避免冷启动时Chrome启动慢导致超时 defaultTimeoutInterval: 1000 * 15, realtimeFailure: true, showColors: true, isVerbose: true, includeStackTrace: true, displaySpecDuration: true, print: function () {}, }, 'capabilities': { 'browserName': 'chrome', acceptInsecureCerts: true, acceptSslCerts: true, // 新增这行,明确ChromeDriver路径 chromeDriver: '/usr/bin/chromedriver', chromeOptions: { binary: "/usr/bin/google-chrome", "excludeSwitches": [ "enable_automation" ], "useAutomationExtension": false, args: [ "--no-sandbox", "--disable-web-security", "--headless", "--disable-dev-shm-usage", "--disable-extensions", "--disable-gpu", "--start-maximized", "--disable-infobars", // 新增以下参数,指定所有写入路径到/tmp "--user-data-dir=/tmp/chrome", "--profile-directory=Default", "--data-path=/tmp/data-path", "--disk-cache-dir=/tmp/cache-dir", "--homedir=/tmp" ] } }, framework: "jasmine" };
第二步:修改Dockerfile,固定Chrome与ChromeDriver版本
删除原有的webdriver-manager相关操作,安装Chrome后直接下载对应版本的ChromeDriver到系统路径,避免版本不兼容:
FROM amazon/aws-lambda-nodejs:12 COPY index.js conf.js handler.js package*.json screenshots ./ ADD gtk-firefox.sh . RUN chmod 755 gtk-firefox.sh RUN ./gtk-firefox.sh # 安装Chrome RUN curl https://intoli.com/install-google-chrome.sh | bash # 下载与已安装Chrome版本完全匹配的ChromeDriver RUN CHROME_VERSION=$(google-chrome --version | grep -oP "[0-9]+\.[0-9]+\.[0-9]+\.[0-9]+") && \ wget -q https://chromedriver.storage.googleapis.com/${CHROME_VERSION}/chromedriver_linux64.zip && \ unzip chromedriver_linux64.zip && \ mv chromedriver /usr/bin/chromedriver && \ chmod +x /usr/bin/chromedriver && \ rm chromedriver_linux64.zip RUN npm install # 删除原有的webdriver-manager操作 # RUN node ./node_modules/protractor/bin/webdriver-manager clean # RUN node ./node_modules/protractor/bin/webdriver-manager update CMD [ "handler.runtest" ]
第三步:本地模拟Lambda环境验证
修改后本地测试时加上用户参数,模拟Lambda的非root运行环境,不用推到ECR就可以验证是否正常:
docker run --user 1001 <你的镜像名>
内容的提问来源于stack exchange,提问作者Shivi
相关产品推荐
相关产品推荐

