
Dockerコンテナビルド後にRSpecでエラー
Dockerコンテナを久々にビルドしてRSpecを実行したらエラーが発生しました。
1 | Selenium::WebDriver::Error::SessionNotCreatedError: |
原因はChromeとChromeDriverのバージョンがあっていないからです。
以前は動作していましたが、今回コンテナを再ビルドしたことによって問題が発生したような形になっています。原因は何でしょうか。
DockerでChromeDriverのバージョンを固定で指定することの問題点
Dockerfileを見てみましょう。
1 | RUN yum install -y unzip \ |
この記述を見ると、google-chrome-stable_current_x86_64.rpmがバージョン84であるときは正常に動作するのですが、バージョンが更新されてしまうと、バージョン固定でインストールしているChromeDriverとバージョンが合わなくなってしまいます。
ということはDockerコンテナをビルドするタイミングでうまくいったり行かなかったりしてしまうということです。これはよくないですね。
ChromeDriverのバージョン自動判別
そこでインストールされるGoogle ChromeのバージョンにあったChromeDriverをインストールするように変更してみます。
先ほどのDockerfileのRUNコマンドを以下のように変更してみます。
1 | RUN yum install -y unzip \ |
変更があったのは以下の3行です
1 | wget -O LATEST_RELEASE_ "https://chromedriver.storage.googleapis.com/LATEST_RELEASE_$(rpm -q --queryformat='%{Version}' google-chrome-stable | sed -e 's/[.][0-9]*$//')" && \ |
なにを行なっているのか一つずつみていきましょう。
インストールされているChromeのバージョン取得
まずは1行目のコマンド置換している箇所を見ていきます。
1 | rpm -q --queryformat='%{Version}' google-chrome-stable |
インストールされているgoogle-chromeをrpmコマンドを使って問い合わせています。--queryformatというオプションはあまり見かけませんが、manページによると以下のようなオプションです。
1 | 検索オプション |
利用できるタグはrpm --querytagsを実行することで全て表示することができます。AmazonLinux2で実行したら、205ありました。
それではrpmコマンドを実際に実行してみます。
1 | # rpm -q --queryformat='%{Version}' google-chrome-stable |
バージョン番号のみ表示されました。
ちなみに通常の出力は以下です。
1 | # rpm -q google-chrome-stable |
Chromeのバージョン番号の整形
バージョン番号をパイプで渡してsedに入力として渡しています。sedの正規表現を見てみましょう。
1 | 's/[.][0-9]*$//' |
[.]は\.でも良さそうですね。数字が0個以上繰り返して、$は行末にマッチします。バージョン番号の最後のオクテットを''に置換しているということになります。
実際に試してみましょう。
1 | $ echo '86.0.4240.75' | sed -e 's/[.][0-9]*$//' |
これでコマンド置換している箇所の文字列が取得できました。次は実際にwgetをしてみます。
ChromeDriverのバージョンを保存
先ほどあったコマンド
1 | wget -O LATEST_RELEASE_ "https://chromedriver.storage.googleapis.com/LATEST_RELEASE_$(rpm -q --queryformat='%{Version}' google-chrome-stable | sed -e 's/[.][0-9]*$//')" |
は
1 | wget -O LATEST_RELEASE_ "https://chromedriver.storage.googleapis.com/LATEST_RELEASE_86.0.4240" |
であることがわかりました。wgetの-Oオプションは、取得したコンテンツを出力するファイル名を指定します。
実際に実行してしましょう。
1 | $ wget -O LATEST_RELEASE_ "https://chromedriver.storage.googleapis.com/LATEST_RELEASE_86.0.4240" |
LATEST_RELEASE_に保存できました。中身を確認します。
1 | $ cat LATEST_RELEASE_ |
これでインストールすべきChromeDriverのバージョンが
ChromeDriverのダウンロード
実際にChromeDriverがダウンロードできるかどうか確認します。
1 | $ wget "https://chromedriver.storage.googleapis.com/$(cat LATEST_RELEASE_)/chromedriver_linux64.zip" |
無事ダウロードできました。これで、いつでもChromeのバージョンにあったChromeDriverがダウンロード、インストールできるようになりました。
まとめ
- ChromeDriverの最新バージョンはChromeのバージョンの一部で構成されるURLで取得できる
- そのURLは
https://chromedriver.storage.googleapis.com/LATEST_RELEASE_バージョン番号である - Chromeのバージョンは少し加工する必要がある