docker镜像中运行chrome驱动程序的问题



我已经编写了一些脚本,使用selenium从网站中提取一些数据。尽管我的代码在docker容器之外运行得很好,但当我在构建映像后运行它时,它会失败。我在谷歌上搜索,在互联网上查找类似的问题,但找不到类似的东西。在这里,我发布了我的docker文件,

# syntax=docker/dockerfile:1
FROM python:latest
WORKDIR /Users/ufomammut/Documents/eplrestapi
COPY requirements.txt requirements.txt
RUN pip3 install -r requirements.txt
RUN curl https://chromedriver.storage.googleapis.com/90.0.4430.24/chromedriver_linux64.zip -O
RUN unzip chromedriver_linux64.zip 
COPY . .

CMD [ "python3", "epl.py"]

当我运行我构建的docker镜像时,我收到的错误消息

Traceback (most recent call last):
File "/Users/ufomammut/Documents/eplrestapi/epl.py", line 172, in <module>
browser = webdriver.Chrome("./chromedriver",options = chr_options)
File "/usr/local/lib/python3.9/site-packages/selenium/webdriver/chrome/webdriver.py", line 73, in __init__
self.service.start()
File "/usr/local/lib/python3.9/site-packages/selenium/webdriver/common/service.py", line 98, in start
self.assert_process_still_running()
File "/usr/local/lib/python3.9/site-packages/selenium/webdriver/common/service.py", line 109, in assert_process_still_running
raise WebDriverException(
selenium.common.exceptions.WebDriverException: Message: Service ./chromedriver unexpectedly exited. Status code was: 255

在我的代码中,我提供了到chromedriver的路径如下:

browser = webdriver.Chrome("./chromedriver",options = chr_options)

现在,我使用了linux arm64 python基本映像,并能够卷曲和解压缩chromedriver,如上面的dockerfile所示。我不再收到格式错误,但我收到了这个错误消息,因为我在上面发布了一条消息,上面说chromedriver意外退出。

您似乎已经将为MacOS构建的chromedriver二进制文件复制到了Debian机器中。根据你如何用macos标记这个问题,你使用的图像python:3.9.5-slim-buster是基于Debian的amd64

我建议你继续坚持尝试通过Dockerfile将Linux 64位chromedrivercurl加载到你的机器中。

要在主机操作系统中测试它,只需将当前的chromedriver二进制文件更改为chromedriver.bakup即可。将linux版本下载到chromedriver并重建docker机器,它将把linux版本复制到新映像中。

看起来您一直在为MacOS使用chromedriver二进制文件,而不是linux版本。

为了使它成为一段"可行"的代码,您可以尝试linux二进制,并在尝试运行docker映像时执行卷映射。使用chromedriver的linux二进制文件,并将其放在系统中需要映射的单独目录中。当你运行你的图像时,尝试使用:

docker run -v <directory_path_to_chromedriver>:<docker_image_directory_path> <image>

您的最后一段代码将使用新的二进制文件路径进行更新。

browser = webdriver.Chrome("<docker_image_directory_path>/chromedriver",options = chr_options)

但对于永久修复,在构建docker映像时卷曲并解压缩linux二进制文件。

看完评论后,我相信您对Docker容器以及它们如何与系统交互有点困惑。

Docker容器运行由FROM层确定的操作系统的独立、隔离和优化版本,并利用系统内核。

现在,您必须使用与linux arm64兼容的Chrome Web驱动程序二进制文件,@Shubham和@lgflorentino正确地指出了这一点。看来你已经这么做了。

您的下一步应该是检查Chrome Webdriver可执行文件的权限,并确保您的容器已正确设置了所有环境路径和变量。

您可以使用命令docker exec-it/bin/bash/bin/sh输入容器,然后手动执行您的bin。这会给你一个更清晰的画面。

同时检查您的环境变量!此外,还可以使用层数减少的改进Dockerfile。

FROM python:latest
#Use a deterministic Python image, mention a version instead of 'latest'
WORKDIR /Users/ufomammut/Documents/eplrestapi
COPY requirements.txt requirements.txt
RUN pip3 install -r requirements.txt && 
curl https://chromedriver.storage.googleapis.com/90.0.4430.24/chromedriver_linux64.zip -O && 
unzip chromedriver_linux64.zip 
COPY . .
#Try adding an ENV layer to make sure your paths are setup properly. (After debugging your container)
CMD [ "python3", "epl.py"]

由于您已经标记了macOs和ARM64,我相信您的开发机器具有Apple Silicon或M1芯片。默认情况下,Apple Silicon机器上的docker引擎会提取基于ARM64的图像,而您的chrome驱动程序是linux64。这意味着您的chrome驱动程序无法在主机内部运行。

您可以使用arm64 chrome驱动程序,也可以从amd64平台构建docker镜像。

docker build -t your-username/multiarch-example:manifest-amd64 --build-arg ARCH=amd64

尝试将--platform=linux/amd64添加到FROM语句中。我用这个给Debian:

FROM --platform=linux/amd64 python:3.9

最新更新