DockerにおけるChrome及びChromeDriverの取得が失敗したのでトラブルシューティングした
発端
GithubActionsでCIの途中でgoogle-chrome-stable
のinstallに失敗し続け、結果CIのコンテナがbuildできないという状態が突如として発生した
解決方法
- 使用しているNodeのImageを上げる
- Google Chrome及びChrome Driverの取得方法の仕様変更に対応
トラブルシューティング
1. イメージが古いのではないか?
確認してみると、使用ImageがNode12だったのでこれが原因か? と思い単純に20に上げてみる。
だが、エラーは解消しない
2. エラーメッセージ付近でググる
「google-chrome-stable
エラー」等々、関連ワードでググる。
ググった結果、ChromeDriverのv.115以上で動かない時の対応という記事がヒット。
結構怪しいなと思い、試してみるもやはり変わらず。
3. クラッシュしている部分をもう1回確認する
現場に立ち戻ってもう少し注意深く見ると
4.580 The following packages have unmet dependencies:
4.620 google-chrome-stable : Depends: libgcc-s1 (>= 4.2) but it is not installable
4.628 E: Unable to correct problems, you have held broken packages.
とログが出ているのに気づく。
よりコアな部分はここだと気づけたのでとりあえずgoogle-chrome-stable : Depends: libgcc-s1 (>= 4.2) but it is not installable
でググる。
結果、google-chrome-stable : Depends: libgcc-s1 (>= 4.2) but it is not installableとDependency on libgcc-s1 but no such package exists in Bionic repoに行き着き、どうやらやはりImageもおかしそうということにアタリをつける。
4. 修正するが別の要因で躓く
どうもdebian‐10のImageだとlibgcc-s1
及びその依存元となるgcc-10
が無さそうなのでとりあえず使用しているライブラリの依存関係の都合、一旦node12
→ node18-bullseye
へ変更。
ついでにDockerfile Chromeのバージョンに合わせて、ChromeDriverをインストールするで紹介されているように
# Chromeをインストール
RUN wget -q -O - https://dl-ssl.google.com/linux/linux_signing_key.pub | apt-key add - && \
echo "deb [arch=amd64] http://dl.google.com/linux/chrome/deb/ stable main" >> /etc/apt/sources.list.d/google-chrome.list && \
apt-get update && apt-get install -y google-chrome-stable
# ChromeDriverをインストール
RUN apt-get update && apt-get install -y unzip && \
CHROME_DRIVER_VERSION=`curl -sS https://googlechromelabs.github.io/chrome-for-testing/LATEST_RELEASE_STABLE` && \
echo "Chrome_Version: ${CHROME_DRIVER_VERSION}" && \
wget -N https://edgedl.me.gvt1.com/edgedl/chrome/chrome-for-testing/$CHROME_VERSION/linux64/chromedriver-linux64.zip -P ~/ && \
unzip ~/chromedriver-linux64.zip -d ~/ && \
rm ~/chromedriver-linux64.zip && \
chown root:root ~/chromedriver-linux64/chromedriver && \
chmod 755 ~/chromedriver-linux64/chromedriver && \
mv ~/chromedriver-linux64/chromedriver /usr/bin/chromedriver
として見るが、どうも ERROR 404: Not Found
及び /chromedriver-linux64.zip
から抜け出せない。
5.unzipが失敗しているときはwgetで失敗している
どうしたものかと思っていたら、unzipが失敗していたのでその辺りからアプローチするように調査するとそのままズバリ【Linux】unzipコマンドが失敗するときはおそらくwgetで失敗している「unzip: cannot find zipfile directory in one of ...」というブログを見つけたので、そもそもちゃんとzipを落とせているのかということを確認してみる。
ターミナルでRUNコマンドを分解し、個別に叩いてみたところ
CHROME_DRIVER_VERSION=
curl -sS https://googlechromelabs.github.io/chrome-for-testing/LATEST_RELEASE_STABLE``
こちらでバージョンは取得できるが
wget -N https://edgedl.me.gvt1.com/edgedl/chrome/chrome-for-testing/$CHROME_VERSION/linux64/chromedriver-linux64.zip -P ~/
この結果は無を取得していたことが判明(ターミナルなので実際のコマンドはcurl -o ~/chromedriver-linux64.zip....
)。
となると、ソースがおいてある場所がまた変わったのか? と思い、バージョン115以降のChrome用WebDriverのダウンロード方法を参考に、こちらから直接Chrome for Testingのバージョン及びドライバーがどうなっているのかを確認してみる。
すると、下記の通りドライバーの一覧を見る限りやはりURLが違っていたことが判明。
6. 本修正してMerge
結果、以下の通りで事なきを得た。
# Appleシリコン製チップ(M系)を使用している場合は、ビルドエラーになる場合があるので、その際は--platform=linux/amd64をつけてからbuildする
FROM node:18-bullseye as node
FROM python:3.8.19-bullseye as python
ENV PYTHONUNBUFFERED 1
RUN apt update --fix-missing
RUN apt install -y vim less procps
RUN apt install -y python3-dev
# 中略
# 公開鍵を利用してChromeをインストールする(stable)
RUN wget -q -O - https://dl-ssl.google.com/linux/linux_signing_key.pub | apt-key add - && \
echo "deb [arch=amd64] http://dl.google.com/linux/chrome/deb/ stable main" >> /etc/apt/sources.list.d/google-chrome.list && \
apt update && apt install -y google-chrome-stable
# ChromeDriverをインストール、前述した通りChrome本体とバージョンを合わせる
RUN apt update && apt install -y unzip && \
CHROME_DRIVER_VERSION=`curl -sS https://googlechromelabs.github.io/chrome-for-testing/LATEST_RELEASE_STABLE` && \
echo "Chrome_Version: ${CHROME_DRIVER_VERSION}" && \
wget -N https://storage.googleapis.com/chrome-for-testing-public/$CHROME_DRIVER_VERSION/linux64/chromedriver-linux64.zip -P ~/ && \
unzip ~/chromedriver-linux64.zip -d ~/ && \
rm ~/chromedriver-linux64.zip && \
chown root:root ~/chromedriver-linux64/chromedriver && \
chmod 755 ~/chromedriver-linux64/chromedriver && \
mv ~/chromedriver-linux64/chromedriver /usr/bin/chromedriver
Discussion