-
-
Save varyonic/dea40abcf3dd891d204ef235c6e8dd79 to your computer and use it in GitHub Desktop.
# See https://codeship.com/documentation/docker/browser-testing/ | |
FROM myapp:base | |
# We need wget to set up the PPA and xvfb to have a virtual screen and unzip to install the Chromedriver | |
RUN apt-get install -y wget xvfb unzip | |
# Set up the Chrome PPA | |
RUN wget -q -O - https://dl-ssl.google.com/linux/linux_signing_key.pub | apt-key add - | |
RUN echo "deb http://dl.google.com/linux/chrome/deb/ stable main" >> /etc/apt/sources.list.d/google.list | |
# Update the package list and install chrome | |
RUN apt-get update -y | |
RUN apt-get install -y google-chrome-stable | |
# Set up Chromedriver Environment variables | |
ENV CHROMEDRIVER_VERSION 2.19 | |
ENV CHROMEDRIVER_DIR /chromedriver | |
RUN mkdir $CHROMEDRIVER_DIR | |
# Download and install Chromedriver | |
RUN wget -q --continue -P $CHROMEDRIVER_DIR "http://chromedriver.storage.googleapis.com/$CHROMEDRIVER_VERSION/chromedriver_linux64.zip" | |
RUN unzip $CHROMEDRIVER_DIR/chromedriver* -d $CHROMEDRIVER_DIR | |
# Put Chromedriver into the PATH | |
ENV PATH $CHROMEDRIVER_DIR:$PATH |
Here is my working version, a slight different take incase it helps:
FROM python:3.10.2-bullseye # Install dependencies RUN apt-get update -y && apt-get install -y wget xvfb unzip jq # Install Google Chrome dependencies RUN apt-get install -y libxss1 libappindicator1 libgconf-2-4 \ fonts-liberation libasound2 libnspr4 libnss3 libx11-xcb1 libxtst6 lsb-release xdg-utils \ libgbm1 libnss3 libatk-bridge2.0-0 libgtk-3-0 libx11-xcb1 libxcb-dri3-0 # Fetch the latest version numbers and URLs for Chrome and ChromeDriver RUN curl -s https://googlechromelabs.github.io/chrome-for-testing/last-known-good-versions-with-downloads.json > /tmp/versions.json RUN CHROME_URL=$(jq -r '.channels.Stable.downloads.chrome[] | select(.platform=="linux64") | .url' /tmp/versions.json) && \ wget -q --continue -O /tmp/chrome-linux64.zip $CHROME_URL && \ unzip /tmp/chrome-linux64.zip -d /opt/chrome RUN chmod +x /opt/chrome/chrome-linux64/chrome RUN CHROMEDRIVER_URL=$(jq -r '.channels.Stable.downloads.chromedriver[] | select(.platform=="linux64") | .url' /tmp/versions.json) && \ wget -q --continue -O /tmp/chromedriver-linux64.zip $CHROMEDRIVER_URL && \ unzip /tmp/chromedriver-linux64.zip -d /opt/chromedriver && \ chmod +x /opt/chromedriver/chromedriver-linux64/chromedriver # Set up Chromedriver Environment variables ENV CHROMEDRIVER_DIR /opt/chromedriver ENV PATH $CHROMEDRIVER_DIR:$PATH # Clean upa RUN rm /tmp/chrome-linux64.zip /tmp/chromedriver-linux64.zip /tmp/versions.json # python dependencies RUN pip install selenium # Copy your Python script into the container COPY test_chromedriver.py /opt/test_chromedriver.py # Command to run the script CMD ["python", "/opt/test_chromedriver.py"]from selenium import webdriver from selenium.webdriver.common.by import By from selenium.webdriver.chrome.options import Options from selenium.webdriver.chrome.service import Service as ChromeService import time def test_chromedriver_installation(): # Setup Chrome options chrome_options = Options() chrome_options.add_argument("--headless") chrome_options.add_argument("--no-sandbox") chrome_options.add_argument("--disable-dev-shm-usage") chrome_options.add_argument("--disable-gpu") # This is important for some versions of Chrome chrome_options.add_argument("--remote-debugging-port=9222") # This is recommended # Set path to Chrome binary chrome_options.binary_location = "/opt/chrome/chrome-linux64/chrome" # Set path to ChromeDriver chrome_service = ChromeService(executable_path="/opt/chromedriver/chromedriver-linux64/chromedriver") # Set up driver driver = webdriver.Chrome(service=chrome_service, options=chrome_options) try: # URL to test driver.get("http://example.com") # Give the browser time to load all content. time.sleep(2) # Find element by tag element = driver.find_element(By.TAG_NAME, "h1") # Print the text of the element print(element.text) # Check if the text is as expected assert "Example Domain" in element.text print("ChromeDriver is installed and working as expected.") except Exception as e: print(f"An error occurred: {e}") finally: # Close the browser # Close the browser driver.quit() test_chromedriver_installation()The builds passes perfectly for me but for testing it fails with driver creation
root@ffb9dfc2e30a:/workspace# python yoda/utils/test.py Traceback (most recent call last): File "/workspace/yoda/utils/test.py", line 50, in <module> test_chromedriver_installation() File "/workspace/yoda/utils/test.py", line 23, in test_chromedriver_installation driver = webdriver.Chrome(service=chrome_service, options=chrome_options) ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ File "/usr/local/lib/python3.12/site-packages/selenium/webdriver/chrome/webdriver.py", line 45, in __init__ super().__init__( File "/usr/local/lib/python3.12/site-packages/selenium/webdriver/chromium/webdriver.py", line 50, in __init__ self.service.start() File "/usr/local/lib/python3.12/site-packages/selenium/webdriver/common/service.py", line 102, in start self.assert_process_still_running() File "/usr/local/lib/python3.12/site-packages/selenium/webdriver/common/service.py", line 115, in assert_process_still_running raise WebDriverException(f"Service {self._path} unexpectedly exited. Status code was: {return_code}") selenium.common.exceptions.WebDriverException: Message: Service /opt/chromedriver/chromedriver-linux64/chromedriver unexpectedly exited. Status code was: 255
I used M1 chip.
Yes I am in the same boat here...
Does anyone have a working code for M1 chip?
This is my current dockerfile
FROM python:3.10.2-bullseye
RUN apt-get update -y && apt-get install -y wget xvfb unzip jq
RUN apt-get install -y libxss1 libappindicator1 libgconf-2-4 \
fonts-liberation libasound2 libnspr4 libnss3 libx11-xcb1 libxtst6 lsb-release xdg-utils \
libgbm1 libnss3 libatk-bridge2.0-0 libgtk-3-0 libx11-xcb1 libxcb-dri3-0
RUN curl -s https://googlechromelabs.github.io/chrome-for-testing/last-known-good-versions-with-downloads.json > /tmp/versions.json
RUN CHROME_URL=$(jq -r '.channels.Stable.downloads.chrome[] | select(.platform=="linux64") | .url' /tmp/versions.json) && \
wget -q --continue -O /tmp/chrome-linux64.zip $CHROME_URL && \
unzip /tmp/chrome-linux64.zip -d /opt/chrome
RUN chmod +x /opt/chrome/chrome-linux64/chrome
RUN CHROMEDRIVER_URL=$(jq -r '.channels.Stable.downloads.chromedriver[] | select(.platform=="linux64") | .url' /tmp/versions.json) && \
wget -q --continue -O /tmp/chromedriver-linux64.zip $CHROMEDRIVER_URL && \
unzip /tmp/chromedriver-linux64.zip -d /opt/chromedriver && \
chmod +x /opt/chromedriver/chromedriver-linux64/chromedriver
ENV CHROMEDRIVER_DIR /opt/chromedriver
ENV PATH $CHROMEDRIVER_DIR:$PATH
RUN rm /tmp/chrome-linux64.zip /tmp/chromedriver-linux64.zip /tmp/versions.json
WORKDIR /app
COPY requirements.txt ./
RUN pip install --no-cache-dir -r requirements.txt
COPY . .
WORKDIR /app/index/api
CMD ["uvicorn", "main:app", "--host", "0.0.0.0", "--port", "8000"]
If you somehow have docker running directly on the M1 mac, you may run into compatibility issues with the other software the dockerfile is trying to use/obtain, even if you change all the chrome/chromedriver references to use mac-arm64. I didn't attempt it myself, and went with a VM.
If you are running through a VM, your dockerfile should match the architecture of the VM. I had trouble trying to use an arm64 linux VM and changing the dockerfile to match (there is not a "non mac" arm64 chrome/chromedriver), but did have success with an x86 VM on the M1 by installing lima. The dockerfile for linux64 mentioned here worked fine for that.
THIS WORKED FOR ME, THANKS SO MUCH! @ankitarya1019
This is my current Docker file:
FROM python:3.11-slim
RUN apt-get update -y && apt-get install -y wget xvfb curl unzip jq
RUN apt-get install -y libxss1 libappindicator1 libgconf-2-4 \
fonts-liberation libasound2 libnspr4 libnss3 libx11-xcb1 libxtst6 lsb-release xdg-utils \
libgbm1 libnss3 libatk-bridge2.0-0 libgtk-3-0 libx11-xcb1 libxcb-dri3-0
RUN curl -s https://googlechromelabs.github.io/chrome-for-testing/last-known-good-versions-with-downloads.json > /tmp/versions.json
RUN CHROME_URL=$(jq -r '.channels.Stable.downloads.chrome[] | select(.platform=="linux64") | .url' /tmp/versions.json) && \
wget -q --continue -O /tmp/chrome-linux64.zip $CHROME_URL && \
unzip /tmp/chrome-linux64.zip -d /opt/chrome
RUN chmod +x /opt/chrome/chrome-linux64/chrome
RUN CHROMEDRIVER_URL=$(jq -r '.channels.Stable.downloads.chromedriver[] | select(.platform=="linux64") | .url' /tmp/versions.json) && \
wget -q --continue -O /tmp/chromedriver-linux64.zip $CHROMEDRIVER_URL && \
unzip /tmp/chromedriver-linux64.zip -d /opt/chromedriver && \
chmod +x /opt/chromedriver/chromedriver-linux64/chromedriver
ENV CHROMEDRIVER_DIR /opt/chromedriver
ENV PATH $CHROMEDRIVER_DIR:$PATH
RUN rm /tmp/chrome-linux64.zip /tmp/chromedriver-linux64.zip /tmp/versions.json
WORKDIR /app
COPY . /app
RUN pip install --default-timeout=200 -r requirements.txt
RUN python -m spacy download en_core_web_sm
CMD uvicorn main:app --port=8080 --host=0.0.0.0
but this gives error:
start chrome An error occurred: Message: session not created: cannot connect to chrome at 127.0.0.1:37177 from session not created: This version of ChromeDriver only supports Chrome version 127 Current browser version is 126.0.6478.61 Stacktrace: #0 0x5bf739dfb6ba <unknown> #1 0x5bf739acb730 <unknown> #2 0x5bf739b0a2bc <unknown> #3 0x5bf739b09242 <unknown> #4 0x5bf739afeccc <unknown> #5 0x5bf739b49e88 <unknown> #6 0x5bf739b3d7f3 <unknown> #7 0x5bf739b0dec9 <unknown> #8 0x5bf739b0e91e <unknown> #9 0x5bf739dc19eb <unknown> #10 0x5bf739dc5972 <unknown> #11 0x5bf739daee15 <unknown> #12 0x5bf739dc6502 <unknown> #13 0x5bf739d93d2f <unknown> #14 0x5bf739dea578 <unknown> #15 0x5bf739dea750 <unknown> #16 0x5bf739dfa48c <unknown> #17 0x75e95f494ac3 <unknown>
Here is my working version, a slight different take incase it helps:
FROM python:3.10.2-bullseye # Install dependencies RUN apt-get update -y && apt-get install -y wget xvfb unzip jq # Install Google Chrome dependencies RUN apt-get install -y libxss1 libappindicator1 libgconf-2-4 \ fonts-liberation libasound2 libnspr4 libnss3 libx11-xcb1 libxtst6 lsb-release xdg-utils \ libgbm1 libnss3 libatk-bridge2.0-0 libgtk-3-0 libx11-xcb1 libxcb-dri3-0 # Fetch the latest version numbers and URLs for Chrome and ChromeDriver RUN curl -s https://googlechromelabs.github.io/chrome-for-testing/last-known-good-versions-with-downloads.json > /tmp/versions.json RUN CHROME_URL=$(jq -r '.channels.Stable.downloads.chrome[] | select(.platform=="linux64") | .url' /tmp/versions.json) && \ wget -q --continue -O /tmp/chrome-linux64.zip $CHROME_URL && \ unzip /tmp/chrome-linux64.zip -d /opt/chrome RUN chmod +x /opt/chrome/chrome-linux64/chrome RUN CHROMEDRIVER_URL=$(jq -r '.channels.Stable.downloads.chromedriver[] | select(.platform=="linux64") | .url' /tmp/versions.json) && \ wget -q --continue -O /tmp/chromedriver-linux64.zip $CHROMEDRIVER_URL && \ unzip /tmp/chromedriver-linux64.zip -d /opt/chromedriver && \ chmod +x /opt/chromedriver/chromedriver-linux64/chromedriver # Set up Chromedriver Environment variables ENV CHROMEDRIVER_DIR /opt/chromedriver ENV PATH $CHROMEDRIVER_DIR:$PATH # Clean upa RUN rm /tmp/chrome-linux64.zip /tmp/chromedriver-linux64.zip /tmp/versions.json # python dependencies RUN pip install selenium # Copy your Python script into the container COPY test_chromedriver.py /opt/test_chromedriver.py # Command to run the script CMD ["python", "/opt/test_chromedriver.py"]from selenium import webdriver from selenium.webdriver.common.by import By from selenium.webdriver.chrome.options import Options from selenium.webdriver.chrome.service import Service as ChromeService import time def test_chromedriver_installation(): # Setup Chrome options chrome_options = Options() chrome_options.add_argument("--headless") chrome_options.add_argument("--no-sandbox") chrome_options.add_argument("--disable-dev-shm-usage") chrome_options.add_argument("--disable-gpu") # This is important for some versions of Chrome chrome_options.add_argument("--remote-debugging-port=9222") # This is recommended # Set path to Chrome binary chrome_options.binary_location = "/opt/chrome/chrome-linux64/chrome" # Set path to ChromeDriver chrome_service = ChromeService(executable_path="/opt/chromedriver/chromedriver-linux64/chromedriver") # Set up driver driver = webdriver.Chrome(service=chrome_service, options=chrome_options) try: # URL to test driver.get("http://example.com") # Give the browser time to load all content. time.sleep(2) # Find element by tag element = driver.find_element(By.TAG_NAME, "h1") # Print the text of the element print(element.text) # Check if the text is as expected assert "Example Domain" in element.text print("ChromeDriver is installed and working as expected.") except Exception as e: print(f"An error occurred: {e}") finally: # Close the browser # Close the browser driver.quit() test_chromedriver_installation()
This is really good work, however update
Set up Chromedriver Environment variables
ENV CHROMEDRIVER_DIR /opt/chromedriver
ENV PATH $CHROMEDRIVER_DIR:$PATH
to:
Set up Chromedriver Environment variables
ENV CHROMEDRIVER_DIR=/opt/chromedriver
ENV PATH=$CHROMEDRIVER_DIR:$PATH
and it works.
Thank you so much @ankitarya1019
I get this error do you really need so many dependencies, i am using python:3.11.2-slim-bullseye as base:
RUN apt-get install -y libxss1 libappindicator1 libgconf-2-4 fonts-liberation libasound2 libnspr4 libnss3 libx11-xcb1 libxtst6 lsb-release xdg-utils libgbm1 libnss3 libatk-bridge2.0-0 libgtk-3-0 libx11-xcb1 libxcb-dri3-0
---> Running in ef18a231d6fa
Reading package lists...
Building dependency tree...
Reading state information...
Package fonts-liberation is not available, but is referred to by another package.
This may mean that the package is missing, has been obsoleted, or
is only available from another source
Package libasound2 is not available, but is referred to by another package.
This may mean that the package is missing, has been obsoleted, or
is only available from another source
Package xdg-utils is not available, but is referred to by another package.
This may mean that the package is missing, has been obsoleted, or
is only available from another source
E: Unable to locate package libxss1
E: Unable to locate package libappindicator1
E: Unable to locate package libgconf-2-4
E: Package 'fonts-liberation' has no installation candidate
E: Package 'libasound2' has no installation candidate
E: Unable to locate package libnspr4
E: Unable to locate package libnss3
E: Unable to locate package libxtst6
E: Unable to locate package lsb-release
E: Package 'xdg-utils' has no installation candidate
E: Unable to locate package libgbm1
E: Unable to locate package libnss3
E: Unable to locate package libatk-bridge2.0-0
E: Couldn't find any package by glob 'libatk-bridge2.0-0'
E: Couldn't find any package by regex 'libatk-bridge2.0-0'
E: Unable to locate package libgtk-3-0
Here is my working version, a slight different take incase it helps:
FROM python:3.10.2-bullseye # Install dependencies RUN apt-get update -y && apt-get install -y wget xvfb unzip jq # Install Google Chrome dependencies RUN apt-get install -y libxss1 libappindicator1 libgconf-2-4 \ fonts-liberation libasound2 libnspr4 libnss3 libx11-xcb1 libxtst6 lsb-release xdg-utils \ libgbm1 libnss3 libatk-bridge2.0-0 libgtk-3-0 libx11-xcb1 libxcb-dri3-0 # Fetch the latest version numbers and URLs for Chrome and ChromeDriver RUN curl -s https://googlechromelabs.github.io/chrome-for-testing/last-known-good-versions-with-downloads.json > /tmp/versions.json RUN CHROME_URL=$(jq -r '.channels.Stable.downloads.chrome[] | select(.platform=="linux64") | .url' /tmp/versions.json) && \ wget -q --continue -O /tmp/chrome-linux64.zip $CHROME_URL && \ unzip /tmp/chrome-linux64.zip -d /opt/chrome RUN chmod +x /opt/chrome/chrome-linux64/chrome RUN CHROMEDRIVER_URL=$(jq -r '.channels.Stable.downloads.chromedriver[] | select(.platform=="linux64") | .url' /tmp/versions.json) && \ wget -q --continue -O /tmp/chromedriver-linux64.zip $CHROMEDRIVER_URL && \ unzip /tmp/chromedriver-linux64.zip -d /opt/chromedriver && \ chmod +x /opt/chromedriver/chromedriver-linux64/chromedriver # Set up Chromedriver Environment variables ENV CHROMEDRIVER_DIR /opt/chromedriver ENV PATH $CHROMEDRIVER_DIR:$PATH # Clean upa RUN rm /tmp/chrome-linux64.zip /tmp/chromedriver-linux64.zip /tmp/versions.json # python dependencies RUN pip install selenium # Copy your Python script into the container COPY test_chromedriver.py /opt/test_chromedriver.py # Command to run the script CMD ["python", "/opt/test_chromedriver.py"]from selenium import webdriver from selenium.webdriver.common.by import By from selenium.webdriver.chrome.options import Options from selenium.webdriver.chrome.service import Service as ChromeService import time def test_chromedriver_installation(): # Setup Chrome options chrome_options = Options() chrome_options.add_argument("--headless") chrome_options.add_argument("--no-sandbox") chrome_options.add_argument("--disable-dev-shm-usage") chrome_options.add_argument("--disable-gpu") # This is important for some versions of Chrome chrome_options.add_argument("--remote-debugging-port=9222") # This is recommended # Set path to Chrome binary chrome_options.binary_location = "/opt/chrome/chrome-linux64/chrome" # Set path to ChromeDriver chrome_service = ChromeService(executable_path="/opt/chromedriver/chromedriver-linux64/chromedriver") # Set up driver driver = webdriver.Chrome(service=chrome_service, options=chrome_options) try: # URL to test driver.get("http://example.com") # Give the browser time to load all content. time.sleep(2) # Find element by tag element = driver.find_element(By.TAG_NAME, "h1") # Print the text of the element print(element.text) # Check if the text is as expected assert "Example Domain" in element.text print("ChromeDriver is installed and working as expected.") except Exception as e: print(f"An error occurred: {e}") finally: # Close the browser # Close the browser driver.quit() test_chromedriver_installation()This is really good work, however update
Set up Chromedriver Environment variables
ENV CHROMEDRIVER_DIR /opt/chromedriver
ENV PATH $CHROMEDRIVER_DIR:$PATHto:
Set up Chromedriver Environment variables
ENV CHROMEDRIVER_DIR=/opt/chromedriver
ENV PATH=$CHROMEDRIVER_DIR:$PATHand it works.
Thank you so much @ankitarya1019
The builds passes perfectly for me but for testing it fails with driver creation
root@ffb9dfc2e30a:/workspace# python yoda/utils/test.py Traceback (most recent call last): File "/workspace/yoda/utils/test.py", line 50, in <module> test_chromedriver_installation() File "/workspace/yoda/utils/test.py", line 23, in test_chromedriver_installation driver = webdriver.Chrome(service=chrome_service, options=chrome_options) ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ File "/usr/local/lib/python3.12/site-packages/selenium/webdriver/chrome/webdriver.py", line 45, in __init__ super().__init__( File "/usr/local/lib/python3.12/site-packages/selenium/webdriver/chromium/webdriver.py", line 50, in __init__ self.service.start() File "/usr/local/lib/python3.12/site-packages/selenium/webdriver/common/service.py", line 102, in start self.assert_process_still_running() File "/usr/local/lib/python3.12/site-packages/selenium/webdriver/common/service.py", line 115, in assert_process_still_running raise WebDriverException(f"Service {self._path} unexpectedly exited. Status code was: {return_code}") selenium.common.exceptions.WebDriverException: Message: Service /opt/chromedriver/chromedriver-linux64/chromedriver unexpectedly exited. Status code was: 255
I used M1 chip.