2022年12月22日木曜日

作成するDockerイメージを環境により切り替える

 Dockerイメージを作成するときに、環境によってDockerfileで実行する内容を変えたい場合がある。プログラミング言語のif文のように条件によって実行する内容を変えられればいいのだが、Dockerにはif文のようなものはない。そこで、シェルスクリプトのif文を使って、環境によりDockerfileで実行する内容を変えてみる。


環境

WSL2(Ubuntu20.04)。

$ lsb_release -dr
Description:    Ubuntu 20.04.5 LTS
Release:        20.04

Raspberry Pi OS(64bit)。

$ lsb_release -dr
Description:    Debian GNU/Linux 11 (bullseye)
Release:        11

今回はこの2つの環境で、Dockerイメージの内容を切り替えるDockrfileを作成する。


CPUアーキテクチャによりDockerfileの内容を切り替える

Raspberry Piで動作するSelenium+最新PythonのDockerコンテナを作成するでは、Raspberry Pi(ARM64)でDockerイメージを作成するためのDockerfileを作成した。Raspberry PiのCPUはARMで、インストールしているgeckodriverはARM用なので、このDockerfileを使ってWSL2のUbuntu(x86_64)上でDockerイメージを作成しても、インストールされたgeckodriverは動作しない。今回は、このDockerfileをRaspberry PiとWSLのどちらでも動作するようにする。

ただし、Dockerfileではif文のような条件分岐はできないので、CPUアーキテクチャによりインストールするgeckodriverを切り替えられるシェルスクリプトを用意して、それをDockerfileで実行する。


シェルスクリプトの作成

まずはgeckodriverをインストールするシェルスクリプトを作成する。CPUアーキテクチャで条件分岐するために、コマンドでCPUアーキテクチャを取得する。以下のコマンドで、CPUアーキテクチャの文字列を取得できる。


$ lscpu | grep -e Architecture: -e アーキテクチャ: | awk -F : '{print $2}' | xargs
 

上記コマンドの出力結果は、Raspberry Piでは「aarch64」、WSLでは「x86_64」となる。このコマンドを使って、次のシェルスクリプトを作成する。

#!/bin/sh

CPU_ARCH="`lscpu | grep -e Architecture: -e アーキテクチャ: | awk -F : '{print $2}' | xargs`"

if [ "${CPU_ARCH}" = "aarch64" ]; then
    curl -LO https://github.com/mozilla/geckodriver/releases/download/v0.32.0/geckodriver-v0.32.0-linux-aarch64.tar.gz
    tar xzvf geckodriver-v0.32.0-linux-aarch64.tar.gz
    mv geckodriver /usr/bin/
    rm geckodriver-v0.32.0-linux-aarch64.tar.gz
else
    curl -LO https://github.com/mozilla/geckodriver/releases/download/v0.32.0/geckodriver-v0.32.0-linux64.tar.gz
    tar xzvf geckodriver-v0.32.0-linux64.tar.gz
    mv geckodriver /usr/bin/
    rm geckodriver-v0.32.0-linux64.tar.gz
fi
 


Dockerfileの作成

シェルスクリプトが用意できたら、Dockerfileを作成する。Raspberry Piで動作するSelenium+最新PythonのDockerコンテナを作成するで作成したDockerfileを変更する。このDockerfileでgeckodriverのインストールをしている箇所を、作成したシェルスクリプトの実行に置き換える。composeファイルなどは前述の記事と同じものを使う。

FROM python:3.11-bullseye
 
WORKDIR /app
 
# Firefoxと日本語フォントインストール
RUN apt update \
    && apt -y install --no-install-recommends \
    # 日本語フォントインストール
    # 日本語フォントをインストールしておかないとFirefoxの表示が文字化けする
    fonts-noto-cjk \
    firefox-esr \
    && apt clean
 
# SeleniumのPythonバインディングインストール
RUN pip install selenium --no-cache-dir

# geckodriverのインストール
COPY ./install_geckodriver.sh ./
RUN chmod u+x install_geckodriver.sh \
    && ./install_geckodriver.sh
 

ファイル構成は以下のようになる。これで、Raspberry PiとWSLのどちらの環境でも、同じDockerfileでコンテナを起動して使える。

|-- Dockerfile
|-- app
| `-- sample.py
|-- install_geckodriver.sh
`-- docker-compose.yml


0 件のコメント:

コメントを投稿