DjangoのDockerコンテナ内にChromeとChromeDriverをインストールする
2023-06-04

はじめに
PythonのWebフレームワークであるDjangoの処理内でウェブスクレイピングを行いたい場合、SeleniumやChromeDriverが一般的に使われます。しかし、これらをDockerコンテナ上で実行するためには、ChromeとChromeDriverをコンテナ内にインストールする必要があります。
今回は、その設定方法について詳しく解説します。まずは、元々のDockerfileから見ていきましょう。
元々のDockerファイル
FROM python:3
ENV PYTHONDONTWRITEBYTECODE=1
ENV PYTHONUNBUFFERED=1
WORKDIR /code
COPY requirements.txt /code/
RUN pip install --upgrade pip && \
pip install -r requirements.txt
COPY ./django/ /code/上記は非常にシンプルなDockerfileで、Python 3の環境をベースにして、特定のディレクトリに移動し、必要なPythonパッケージをインストールしています。
しかしここに、SeleniumとChromeDriverを使うための設定を追加する必要があります。
修正後のDockerファイル
以下に修正後のDockerfileを示します。
FROM python:3
ENV PYTHONDONTWRITEBYTECODE=1
ENV PYTHONUNBUFFERED=1
# Google Chromeをインストール
RUN apt-get update && apt-get install -y wget gnupg2 unzip
RUN wget https://dl.google.com/linux/direct/google-chrome-stable_current_amd64.deb && \
dpkg -i google-chrome-stable_current_amd64.deb || apt-get -fy install
# ChromeDriverをインストール
RUN CHROMEDRIVER_VERSION='114.0.5735.90' && \
mkdir -p /opt/chromedriver-$CHROMEDRIVER_VERSION && \
curl -sS -o /tmp/chromedriver_linux64.zip http://chromedriver.storage.googleapis.com/$CHROMEDRIVER_VERSION/chromedriver_linux64.zip && \
unzip /tmp/chromedriver_linux64.zip -d /opt/chromedriver-$CHROMEDRIVER_VERSION && \
rm /tmp/chromedriver_linux64.zip && \
chmod +x /opt/chromedriver-$CHROMEDRIVER_VERSION/chromedriver && \
ln -fs /opt/chromedriver-$CHROMEDRIVER_VERSION/chromedriver /usr/local/bin/chromedriver
WORKDIR /code
COPY requirements.txt /code/
RUN pip install --upgrade pip && \
pip install -r requirements.txt
COPY ./django/ /code/それぞれの修正箇所について詳しく説明
Google Chromeのインストール
# Google Chromeをインストール
RUN apt-get update && apt-get install -y wget gnupg2 unzip
RUN wget https://dl.google.com/linux/direct/google-chrome-stable_current_amd64.deb && \
dpkg -i google-chrome-stable_current_amd64.deb || apt-get -fy installこの部分ではGoogle Chromeをインストールしています。まず、apt-get updateでパッケージリストを最新化します。次に、apt-get install -y wget gnupg2 unzipで、Chromeをインストールするために必要なパッケージ(wget, gnupg2, unzip)をインストールします。
次に、wget https://dl.google.com/linux/direct/google-chrome-stable_current_amd64.debでGoogle Chromeの安定版(amd64バージョン)をダウンロードします。ダウンロードした.debファイルをdpkg -iでインストールします。
しかし、このインストールが依存関係の問題で失敗する可能性があります。そのため、|| apt-get -fy installで、失敗した場合には強制的に依存関係を解決しながらインストールを行うようにしています。
ChromeDriverのインストール
# ChromeDriverをインストール
RUN CHROMEDRIVER_VERSION='114.0.5735.90' && \
mkdir -p /opt/chromedriver-$CHROMEDRIVER_VERSION && \
curl -sS -o /tmp/chromedriver_linux64.zip http://chromedriver.storage.googleapis.com/$CHROMEDRIVER_VERSION/chromedriver_linux64.zip && \
unzip /tmp/chromedriver_linux64.zip -d /opt/chromedriver-$CHROMEDRIVER_VERSION && \
rm /tmp/chromedriver_linux64.zip && \
chmod +x /opt/chromedriver-$CHROMEDRIVER_VERSION/chromedriver && \
ln -fs /opt/chromedriver-$CHROMEDRIVER_VERSION/chromedriver /usr/local/bin/chromedriverここではChromeDriverのインストールを行っています。まず、CHROMEDRIVER_VERSION='114.0.5735.90'でインストールしたいChromeDriverのバージョンを指定します。
次に、mkdir -p /opt/chromedriver-$CHROMEDRIVER_VERSIONで、ダウンロードしたChromeDriverを保存するディレクトリを作成します。
その後、curl -sS -o /tmp/chromedriver_linux64.zip http://chromedriver.storage.googleapis.com/$CHROMEDRIVER_VERSION/chromedriver_linux64.zipで指定したバージョンのChromeDriverをダウンロードします。
ダウンロードしたzipファイルをunzip /tmp/chromedriver_linux64.zip -d /opt/chromedriver-$CHROMEDRIVER_VERSIONで解凍し、解凍したファイルをchmod +x /opt/chromedriver-$CHROMEDRIVER_VERSION/chromedriverで実行可能にします。
最後に、ln -fs /opt/chromedriver-$CHROMEDRIVER_VERSION/chromedriver /usr/local/bin/chromedriverで、/usr/local/binにChromeDriverへのシンボリックリンクを作成します。これにより、コンテナ内のどの場所からでもchromedriverコマンドを利用できるようになります。
まとめ
Dockerを利用した環境でSeleniumとChromeDriverを使用するには、Dockerfileを適切に編集する必要があります。具体的には、Google ChromeとChromeDriverのインストールをDockerfileに追記し、それぞれがDockerコンテナ内で適切に動作するように設定します。この設定により、Dockerコンテナ内でスクレイピングを行う際の初期設定を容易にし、また再現性と携帯性を向上させます。