Docker 中用于 AWS ECS 的 Python Selenium 设置

问题描述 投票:0回答:1

我一直在尝试使用 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 中缺少什么?

python docker selenium-webdriver selenium-chromedriver amazon-ecs
1个回答
0
投票

我也面临同样的错误,这里有解决办法吗?

© www.soinside.com 2019 - 2024. All rights reserved.