我一直在尝试使用 AWS python 图像为我的 ECS 设置 python selenium。但是 chromedriver 无法启动 chrome 二进制文件,即使我已经提供了正确的二进制位置并通过检查安装了额外的库
ldd chrome
和 ldd chromedriver
命令。
下面是我的Dockerfile
ARG FROM_IMAGE=public.ecr.aws/bitnami/python:3.11.5
FROM ${FROM_IMAGE}
RUN apt-get update && \
apt-get install -y unzip curl libnss3 libxcb1
RUN apt-get update && \
apt-get install -y \
libdbus-1-3 \
libatk1.0-0 \
libatk-bridge2.0-0 \
libcups2 \
libdrm2 \
libxkbcommon0 \
libatspi2.0-0 \
libx11-6 \
libxcomposite1 \
libxdamage1 \
libxext6 \
libxfixes3 \
libxrandr2 \
libgbm1 \
libpango-1.0-0 \
libcairo2 \
libasound2
RUN apt-get install python3-pip -y
RUN apt-get install python3-dev -y
RUN apt-get install gcc g++ -y
RUN pip install --upgrade pip
RUN apt-get -y update && apt-get install -y --no-install-recommends \
wget \
git \
ca-certificates \
&& rm -rf /var/lib/apt/lists/*
ENV PYTHONUNBUFFERED=TRUE
ENV PYTHONDONTWRITEBYTECODE=TRUE
ENV PATH="/opt/program:/opt/program/chromedriver:${PATH}"
RUN mkdir /opt/program
RUN mkdir /opt/program/data
COPY . /opt/program
RUN curl -Lo "/tmp/chromedriver-linux64.zip" "https://edgedl.me.gvt1.com/edgedl/chrome/chrome-for-testing/121.0.6167.85/linux64/chromedriver-linux64.zip" && \
curl -Lo "/tmp/chrome-linux64.zip" "https://edgedl.me.gvt1.com/edgedl/chrome/chrome-for-testing/121.0.6167.85/linux64/chrome-linux64.zip" && \
unzip /tmp/chromedriver-linux64.zip -d /opt/program && \
unzip /tmp/chrome-linux64.zip -d /opt/program
WORKDIR /opt/program
RUN pip install -r requirements.txt
CMD [ "python", "main.py" ]
下面是我的 main.py 文件
from selenium import webdriver
from selenium.webdriver.chrome.service import Service
from tempfile import mkdtemp
# Create Chrome options
options = webdriver.ChromeOptions()
service = Service("/opt/program/chromedriver-linux64/chromedriver")
options.binary_location = '/opt/program/chrome-linux64/chrome'
options.add_argument('--headless') # Run Chrome in headless mode (no GUI)
options.add_argument('--no-sandbox') # Bypass OS security model
options.add_argument("--disable-gpu")
options.add_argument("--window-size=1280x1696")
options.add_argument("--single-process")
options.add_argument("--disable-dev-shm-usage")
options.add_argument("--disable-dev-tools")
options.add_argument("--no-zygote")
options.add_argument(f"--user-data-dir={mkdtemp()}")
options.add_argument(f"--data-path={mkdtemp()}")
options.add_argument(f"--disk-cache-dir={mkdtemp()}")
options.add_argument("--remote-debugging-port=9222")
# Create a new instance of Chrome driver
driver = webdriver.Chrome(service=service, options=options)
# Open Google page
driver.get('https://www.google.com')
# Print the title of the page
print("Page Title:", driver.title)
# Close the browser
driver.quit()
这正是我运行这个 docker 镜像时遇到的错误。
Traceback (most recent call last):
File "/opt/program/main.py", line 23, in <module>
driver = webdriver.Chrome(service=service, options=options)
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
File "/opt/bitnami/python/lib/python3.11/site-packages/selenium/webdriver/chrome/webdriver.py", line 84, in __init__
super().__init__(
File "/opt/bitnami/python/lib/python3.11/site-packages/selenium/webdriver/chromium/webdriver.py", line 104, in __init__
super().__init__(
File "/opt/bitnami/python/lib/python3.11/site-packages/selenium/webdriver/remote/webdriver.py", line 286, in __init__
self.start_session(capabilities, browser_profile)
File "/opt/bitnami/python/lib/python3.11/site-packages/selenium/webdriver/remote/webdriver.py", line 378, in start_session
response = self.execute(Command.NEW_SESSION, parameters)
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
File "/opt/bitnami/python/lib/python3.11/site-packages/selenium/webdriver/remote/webdriver.py", line 440, in execute
self.error_handler.check_response(response)
File "/opt/bitnami/python/lib/python3.11/site-packages/selenium/webdriver/remote/errorhandler.py", line 245, in check_response
raise exception_class(message, screen, stacktrace)
selenium.common.exceptions.SessionNotCreatedException: Message: session not created: Chrome failed to start: exited normally.
(chrome not reachable)
(The process started from chrome location /opt/program/chrome-linux64/chrome is no longer running, so ChromeDriver is assuming that Chrome has crashed.)
Stacktrace:
#0 0x00400077cd93 <unknown>
#1 0x004000460337 <unknown>
#2 0x004000494bc0 <unknown>
#3 0x004000490765 <unknown>
#4 0x0040004dab7c <unknown>
#5 0x0040004ce1e3 <unknown>
#6 0x00400049e135 <unknown>
#7 0x00400049f13e <unknown>
#8 0x004000740e4b <unknown>
#9 0x004000744dfa <unknown>
#10 0x00400072d6d5 <unknown>
#11 0x004000745a6f <unknown>
#12 0x00400071169f <unknown>
#13 0x00400076a098 <unknown>
#14 0x00400076a262 <unknown>
#15 0x00400077bf34 <unknown>
#16 0x0040027dbea7 start_thread
我的 Dockerfile 中缺少什么?
我也面临同样的错误,这里有解决办法吗?