こんばんはエンジニアの眠れない夜です。
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で行います。
設定ができたら下記のコマンドを実行します。
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の解説
もう少し詳しく知りたい方のために、それぞれの設定内容の説明です。
FROM python:3.12
でPythonの公式イメージをベースにします。最新のPythonバージョンを使用しています。-
RUN apt-get update && apt-get install -y ...
でChromeとSeleniumの依存関係をインストールします。これらのパッケージはChromeとSeleniumの実行に必要です。 -
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のパッケージリポジトリを追加します。 -
RUN apt-get update && apt-get install -y google-chrome-stable
でChromeの安定版をインストールします。 -
RUN wget -O chrome.json https://googlechromelabs.github.io/chrome-for-testing/known-good-versions-with-downloads.json && ...
でChromeDriverの最新バージョンをダウンロードしてインストールします。これにより、Chromeのバージョンに合ったChromeDriverを自動的に取得できます。 -
RUN pip install selenium
でPython用のSeleniumライブラリをインストールします。 -
COPY main.py /main.py
でPythonのスクリプトをコンテナにコピーします。 -
CMD ["python", "/main.py"]
でコンテナ起動時にPythonスクリプトを実行するように設定します。
Pythonスクリプトの解説
-
from selenium import webdriver
とfrom selenium.webdriver.chrome.options import Options
でSeleniumとChromeのオプションをインポートします。 -
chrome_options = Options()
でChromeのオプションを初期化します。 -
chrome_options.add_argument("--no-sandbox")
とchrome_options.add_argument("--disable-dev-shm-usage")
でコンテナ内で実行するために必要なオプションを追加します。このオプションが無いと動きません -
chrome_options.add_argument('--headless')
でヘッドレスモードを有効にします。これによりGUIを使用せずにChromeを実行できます。このオプションが無いと動きません -
driver = webdriver.Chrome(options=chrome_options)
でChromeDriverを初期化します。 -
driver.get("https://www.selenium.dev/selenium/web/web-form.html")
で指定したURLを開きます。 -
title = driver.title
でページのタイトルを取得します。 -
print('title',title)
でタイトルを出力します。 -
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での開発時は公式のドキュメントにある次のライブラリを使って
Docker compose で連携させて使うのが現状では開発に向いていると思います。
2024年3月20日時点で思ったことなので時間が経てば改善されることを期待します。
コメントを残す