DockerにおけるChrome及びChromeDriverの取得が失敗したのでトラブルシューティングした


# 発端

GithubActionsでCIの途中で`google-chrome-stable`のinstallに失敗し続け、結果CIのコンテナがbuildできないという状態が突如として発生した

# 解決方法

1. 使用しているNodeのImageを上げる
2. Google Chrome及びChrome Driverの取得方法の仕様変更に対応

# トラブルシューティング

## 1. イメージが古いのではないか？

確認してみると、使用ImageがNode12だったのでこれが原因か？ と思い単純に20に上げてみる。
だが、エラーは解消しない

## 2. エラーメッセージ付近でググる

「`google-chrome-stable` エラー」等々、関連ワードでググる。
ググった結果、[ChromeDriverのv.115以上で動かない時の対応](https://qiita.com/sgash708/items/5040d16a231394016b19)という記事がヒット。
結構怪しいなと思い、試してみるもやはり変わらず。

## 3. クラッシュしている部分をもう1回確認する

現場に立ち戻ってもう少し注意深く見ると

```bash
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](https://askubuntu.com/questions/1524103/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](https://github.com/f4exb/sdrangel/issues/524)に行き着き、どうやらやはりImageもおかしそうということにアタリをつける。

## 4. 修正するが別の要因で躓く

どうもdebian‐10のImageだと`libgcc-s1`及びその依存元となる`gcc-10`が無さそうなのでとりあえず使用しているライブラリの依存関係の都合、一旦`node12` → `node18-bullseye`へ変更。
ついでに[Dockerfile Chromeのバージョンに合わせて、ChromeDriverをインストールする](https://qiita.com/tru-y/items/49455a24c29498f24aa9)で紹介されているように

```bash
# 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 ...」](https://maitakeramen.hatenablog.com/entry/2019/06/08/145911)というブログを見つけたので、そもそもちゃんと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のダウンロード方法](https://gammasoft.jp/support/chrome-webdriver-for-ver115-and-newer/)を参考に、[こちら](https://developer.chrome.com/docs/chromedriver/downloads?hl=ja)から直接Chrome for Testingのバージョン及びドライバーがどうなっているのかを確認してみる。
すると、下記の通り[ドライバーの一覧](https://googlechromelabs.github.io/chrome-for-testing/#stable)を見る限りやはりURLが違っていたことが判明。

![](https://raw.githubusercontent.com/t-kibu/zenn-content-kibu/main/images/articles/20240827-chromedriver/image.png)

## 6. 本修正してMerge

結果、以下の通りで事なきを得た。

```bash

# 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
```