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 件のコメント:
コメントを投稿