【Python】DockerコンテナにSeleniumをインストールする方法

こんばんはエンジニアの眠れない夜です。

PythonのDockerコンテナにSeleniumをインストールしたいことってありますよね。

ChromeDriverの配布方法が変わって設定につまずいていませんか?

そんな方のために python:3.12 のDockerイメージに Seleniumをインストールして実行するまでの最小限のコードを紹介します。

Apple SiliconのMacでも実行できるのでMacユーザーも安心してくださいね!

Python Dockerイメージに Chrome ChromeDriver Seleniumをインストール

まずは、Dockerfileを作成します。

続いて、main.py をDockerfileと同じディレクトリに作成します。

from selenium import webdriver
from selenium.webdriver.chrome.options import Options
from selenium.webdriver.common.by import By # Add this import statement

chrome_options = Options()
chrome_options.add_argument("--no-sandbox")
chrome_options.add_argument('--headless')
chrome_options.add_argument("--disable-dev-shm-usage")

driver = webdriver.Chrome(options=chrome_options)

driver.get("https://www.selenium.dev/selenium/web/web-form.html")

title = driver.title

print('title',title)
driver.quit()

2つのファイルを作成できたら、次のコマンドを実行してビルドします。

docker build . -t docker run py-selenium

Apple Siliconの場合次の記事の設定をDocker for Macで行います。

【Python】DockerコンテナにSeleniumをインストールする方法

設定ができたら下記のコマンドを実行します。

docker build --platform=linux/arm64 -t py-selenium .

プラットフォームの指定を忘れると
failed to solve: process "/bin/sh -c apt-get update && apt-get install -y google-chrome-stable" did not complete successfully: exit code: 100 というエラーが出るので注意。

ビルドしたコンテナを実行します。

docker run py-selenium

Apple Siliconの場合

docker run --platform=linux/amd64 py-selenium

title Web formが表示されれば成功です!

とても簡単でしたよね?

でも、私は色々回り回ってここにたどり着くまでに半日を費やしました…

ぜひ、DockerにSeleniumのインストールで困っている方の役に立てれば幸いです

Dockerfileの解説

もう少し詳しく知りたい方のために、それぞれの設定内容の説明です。

  1. FROM python:3.12でPythonの公式イメージをベースにします。最新のPythonバージョンを使用しています。

  2. RUN apt-get update && apt-get install -y ...でChromeとSeleniumの依存関係をインストールします。これらのパッケージはChromeとSeleniumの実行に必要です。

  3. 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でGoogleのパッケージリポジトリを追加します。

  4. RUN apt-get update && apt-get install -y google-chrome-stableでChromeの安定版をインストールします。

  5. RUN wget -O chrome.json https://googlechromelabs.github.io/chrome-for-testing/known-good-versions-with-downloads.json && ...でChromeDriverの最新バージョンをダウンロードしてインストールします。これにより、Chromeのバージョンに合ったChromeDriverを自動的に取得できます。

  6. RUN pip install seleniumでPython用のSeleniumライブラリをインストールします。

  7. COPY main.py /main.pyでPythonのスクリプトをコンテナにコピーします。

  8. CMD ["python", "/main.py"]でコンテナ起動時にPythonスクリプトを実行するように設定します。

Pythonスクリプトの解説

  1. from selenium import webdriverfrom selenium.webdriver.chrome.options import OptionsでSeleniumとChromeのオプションをインポートします。

  2. chrome_options = Options()でChromeのオプションを初期化します。

  3. chrome_options.add_argument("--no-sandbox")chrome_options.add_argument("--disable-dev-shm-usage")でコンテナ内で実行するために必要なオプションを追加します。このオプションが無いと動きません

  4. chrome_options.add_argument('--headless')でヘッドレスモードを有効にします。これによりGUIを使用せずにChromeを実行できます。このオプションが無いと動きません

  5. driver = webdriver.Chrome(options=chrome_options)でChromeDriverを初期化します。

  6. driver.get("https://www.selenium.dev/selenium/web/web-form.html")で指定したURLを開きます。

  7. title = driver.titleでページのタイトルを取得します。

  8. print('title',title)でタイトルを出力します。

  9. driver.quit()でChromeDriverを終了します。

この時点でのSeleniumのバージョンは4.18.1です。時間が経って上記のコードが動かないときはSeleniumのバージョンを指定しても良いかもしれません。

RUN pip install selenium==4.18.1

まとめ: PythonのDockerコンテナでSeleniumを使う設定のポイント

下記のコードで新しくなったChromedriverのページから最新版をダウンロードするところが、今回の設定のポイントです。

RUN wget -O chrome.json https://googlechromelabs.github.io/chrome-for-testing/known-good-versions-with-downloads.json && \
LINUX_STABLE_URL=$(grep -oP '"url":".*?(?=")' chrome.json | grep 'linux64' | head -n 1 | cut -d'"' -f4) && \
wget -O chrome.zip $LINUX_STABLE_URL && \
unzip chrome.zip && \
rm chrome.zip chrome.json

それからMacユーザーはプラットフォームの指定をビルドと実行時に忘れないようにしましょう。
--platform=linux/arm64

ぜひこの記事がDockerでSeleniumを動かしたい人の参考になりますように!

それでは、楽しいプログラミングライフを!

【追記】AppleSiliconでのSelenium Dockerの開発について

上記の方法でひとまずビルドは通ったのですが、Seleniumの挙動が安定しません。

起動はできましたが、処理の途中でタイムアウトになったり、結果が返ってこなかったりします

なので、AppleSiliconでの開発時は公式のドキュメントにある次のライブラリを使って

seleniarm/standalone-chromium

Docker compose で連携させて使うのが現状では開発に向いていると思います。

2024年3月20日時点で思ったことなので時間が経てば改善されることを期待します。

コメントを残す

このサイトはスパムを低減するために Akismet を使っています。コメントデータの処理方法の詳細はこちらをご覧ください