问题描述
我有一个工作的Docker容器,想迁移到firefox上的硒3.141的lambda层。工作容器的Dockerfile是:
FROM python:3.7-slim
RUN /usr/local/bin/python -m pip install --upgrade pip
RUN pip install selenium==3.141.0
RUN apt-get update
RUN apt-get -y install wget bzip2 firefox-esr #68.12.0esr
workdir /tmp
RUN wget https://github.com/mozilla/geckodriver/releases/download/v0.26.0/geckodriver-v0.26.0-linux64.tar.gz
RUN tar -zxf geckodriver-v0.26.0-linux64.tar.gz -C /usr/local/bin/
当我在此容器中执行以下操作时,将创建一个Firefox
对象。
from selenium.webdriver import Firefox
from selenium.webdriver.firefox.options import Options
opts = Options()
opts.headless = True
Firefox(options=opts,service_log_path='/home/geckodriver.log')
对于lambda层,我使用amazonlinux
图像进行本地测试。在aws上,我提供的一个zip文件将被提取到/opt
中,因此我想将所有内容都放入/opt
中,看看它是否有效。
我的dockerfile是
FROM amazonlinux
workdir /
RUN yum update -y
# Install Python 3.7
RUN yum install python3 zip unzip wget tar bzip2 bzip2-libs gzip -y
RUN pip3.7 install --upgrade pip
RUN pip3.7 install selenium==3.141.0 #-t /opt/python/lib/python3.7/site-packages
RUN wget https://github.com/mozilla/geckodriver/releases/download/v0.26.0/geckodriver-v0.26.0-linux64.tar.gz
RUN tar -zxf geckodriver-v0.26.0-linux64.tar.gz -C /opt
RUN wget https://ftp.mozilla.org/pub/firefox/releases/68.9.0esr/linux-x86_64/de/firefox-68.9.0esr.tar.bz2
RUN tar -xvjf firefox-68.9.0esr.tar.bz2 -C /opt
但是当我用它运行
sudo docker build -t selenium:fftest -f Dockerfile.ff .
sudo docker run --rm -it -v $(pwd):/data selenium:fftest
并执行
from selenium.webdriver.firefox.options import Options
from selenium.webdriver.firefox.firefox_binary import FirefoxBinary
from selenium.webdriver import Firefox
opts = Options()
opts.headless = True
firefox_dir = '/opt/'
gecko_dir = '/opt/'
binary = FirefoxBinary( firefox_dir + 'firefox/firefox')
Firefox(options=opts,executable_path= gecko_dir + 'geckodriver',firefox_binary=binary)
我明白了
Traceback (most recent call last):
File "<stdin>",line 1,in <module>
File "/usr/local/lib/python3.7/site-packages/selenium/webdriver/firefox/webdriver.py",line 174,in __init__
keep_alive=True)
File "/usr/local/lib/python3.7/site-packages/selenium/webdriver/remote/webdriver.py",line 157,in __init__
self.start_session(capabilities,browser_profile)
File "/usr/local/lib/python3.7/site-packages/selenium/webdriver/remote/webdriver.py",line 252,in start_session
response = self.execute(Command.NEW_SESSION,parameters)
File "/usr/local/lib/python3.7/site-packages/selenium/webdriver/remote/webdriver.py",line 321,in execute
self.error_handler.check_response(response)
File "/usr/local/lib/python3.7/site-packages/selenium/webdriver/remote/errorhandler.py",line 242,in check_response
raise exception_class(message,screen,stacktrace)
selenium.common.exceptions.WebDriverException: Message: invalid argument: can't kill an exited process
我已经尝试了
检查版本兼容性
此答案https://stackoverflow.com/a/52535654/3014199表示版本不兼容,但根据table,我对硒3.141,Geckodriver 22和Firefox 68表示满意。
以非root用户身份运行
链接的答案还建议以非root用户身份运行。我终于设法做到了:
FROM amazonlinux
RUN yum update -y
RUN yum install python3 wget tar bzip2 bzip2-libs gzip -y
Run yum install shadow-utils -y
RUN useradd -ms /bin/bash jd
RUN echo "jd:password" | chpasswd
RUN usermod -aG root jd
USER jd
workdir /home/jd
RUN pip3.7 install --user --upgrade pip
RUN pip3.7 install --user selenium==3.141.0
copY downloads/geckodriver-v0.26.0-linux64.tar.gz /tmp/
copY downloads/firefox-68.9.0esr.tar.bz2 /tmp/
USER root
RUN tar -zxf /tmp/geckodriver-v0.26.0-linux64.tar.gz -C /opt
RUN tar -xvjf /tmp/firefox-68.9.0esr.tar.bz2 -C /opt
RUN chown -R jd:jd /opt/firefox
USER jd
/opt
中的所有内容都以jd
作为所有者和组,但是错误消息是相同的。
将所有内容提取到/ usr / local / bin
当我将geckodriver和firefox都提取到/usr/local/bin
中时,我无法仅用Firefox(options=opts)
进行实例化,但会遇到相同的can't kill an exited process
错误。
检查二进制文件
$ /opt/firefox/firefox --version
xpcOMglueLoad error for file /opt/firefox/libmozgtk.so:
libgtk-3.so.0: cannot open shared object file: No such file or directory
Couldn't load xpcOM.
我认为丢失的目标文件是根本原因。但是我不知道从哪里得到它以及放在哪里(我只能将它放在/opt
中)。
文件yum install gtk3-devel
缺少libdbus-glib-1.so.2
/opt/firefox/libxul.so
之后。
解决方法
暂无找到可以解决该程序问题的有效方法,小编努力寻找整理中!
如果你已经找到好的解决方法,欢迎将解决方案带上本链接一起发送给小编。
小编邮箱:dio#foxmail.com (将#修改为@)