Dockerイメージを作成するときに、環境によってDockerfileで実行する内容を変えたい場合がある。プログラミング言語のif文のように条件によって実行する内容を変えられればいいのだが、Dockerにはif文のようなものはない。そこで、シェルスクリプトのif文を使って、環境によりDockerfileで実行する内容を変えてみる。
環境
WSL2(Ubuntu20.04)。
1 2 3 | $ lsb_release -dr Description: Ubuntu 20.04.5 LTS Release: 20.04 |
Raspberry Pi OS(64bit)。
1 2 3 | $ 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アーキテクチャの文字列を取得できる。
1 2 | $ lscpu | grep -e Architecture: -e アーキテクチャ: | awk -F : '{print $2}' | xargs |
上記コマンドの出力結果は、Raspberry Piでは「aarch64」、WSLでは「x86_64」となる。このコマンドを使って、次のシェルスクリプトを作成する。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 | #!/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ファイルなどは前述の記事と同じものを使う。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 | 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でコンテナを起動して使える。
1 2 3 4 5 | |-- Dockerfile |-- app | `-- sample.py |-- install_geckodriver.sh `-- docker-compose.yml |
0 件のコメント:
コメントを投稿