我已经编写了一些脚本,使用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