php:5.6-apache(debianベース)のdockerイメージをビルドの際 `RUN apt-get update`がエラーとなる件

php:5.6-apacheのdockerイメージでapt-get updateがエラーとなる

php:5.6-apacheのdockerイメージをビルドする際に、DockerfileのRUNで実行する`apt-get update`コマンド実行時に以下のエラーが発生し、ビルドが中断しました。

ビルドの際に発生したエラー(抜粋)

W: The repository 'http://security.debian.org/debian-security stretch/updates Release' does not have a Release file.
W: The repository 'http://deb.debian.org/debian stretch Release' does not have a Release file.
W: The repository 'http://deb.debian.org/debian stretch-updates Release' does not have a Release file.
E: Failed to fetch http://security.debian.org/debian-security/dists/stretch/updates/main/binary-arm64/Packages  404  Not Found [IP: 151.101.2.132 80]
E: Failed to fetch http://deb.debian.org/debian/dists/stretch/main/binary-arm64/Packages  404  Not Found
E: Failed to fetch http://deb.debian.org/debian/dists/stretch-updates/main/binary-arm64/Packages  404  Not Found
E: Some index files failed to download. They have been ignored, or old ones used instead.

 

Dockerfile

FROM php:5.6-apache
RUN apt-get update

なお今回の `php:5.6-apache` 以外にも他のPHP5マイナーバージョンの-apacheイメージでも同様の事象が確認できていますが、それらの場合でも以降の手順で解決することができます。

原因と対処方法

原因について

こちらのエラーはphp:5.6-apacheのdockerイメージのベースイメージのOSである、
Debian 9 (別名:strech)のサポート期限が終了したことにより発生しているものです。

Debian公式より
Debian 9 (strech)のサポート期限は2022年6月末で終了

Debian 9のサポート期限が終了したことにより、
`apt-get update`コマンド実行時に参照するセキュリティアップデート用のリポジトリやメンテナンス用のリポジトリから、エラーメッセージにも記載のあるReleaseファイル※やパッケージ情報といった必要な情報が削除されてしまっており、コマンドの実行時にそれらを取得することができずにエラーが発生しています。

※ Releaseファイルはリポジトリのメタデータを表し、`apt-get update`コマンドでリポジトリを参照する際に必ず必要となるファイル

対処方法について

このエラーの対処としてはdockerイメージの選択を、ベースイメージのOSがサポート期限内のものに変更すれば良いですが、
開発の都合上どうしてもこのイメージをそのまま使いたい場合は、`apt-get update`コマンドを実行する前に以下に示すリポジトリ情報の書き換えとaptの設定の上書きを行うことでエラーを回避できます。

(PHP Ver.5 自体も公式のサポートが切れていますけど…)

リポジトリ情報の書き換えとaptの設定を加える

FROM php:5.6-apache

# apt-get updateより前に追加
RUN echo "deb http://archive.debian.org/debian/ stretch main contrib non-free" > /etc/apt/sources.list && \
    echo "deb-src http://archive.debian.org/debian/ stretch main contrib non-free" >> /etc/apt/sources.list && \
    echo "Acquire::Check-Valid-Until false;" > /etc/apt/apt.conf

RUN apt-get update

Dockerfileに上記を加えてビルドし直すことで`apt-get update`が実行できるようになります。

以降、追記した内容を一行ごとに解説します。

echo "deb http://archive.debian.org/debian/ stretch main contrib non-free" > /etc/apt/sources.list

/etc/apt/sources.list ファイルに新しいリポジトリ情報を書き込む。

deb
Debianパッケージリポジトリを指定
http://archive.debian.org/debian/
Debianアーカイブリポジトリを指定
main contrib non-free
有効にするメインコンポーネントとコントリビューターコンポーネントを指定

 

echo "deb-src http://archive.debian.org/debian/ stretch main contrib non-free" >> /etc/apt/sources.list

ソースパッケージを含むリポジトリ情報を /etc/apt/sources.list ファイルに追加。

 

echo "Acquire::Check-Valid-Until false;" > /etc/apt/apt.conf

Acquire::Check-Valid-Until false; は、キャッシュされた情報の有効期限を無効にする設定で、apt-get update時にリポジトリの有効期限をチェックしないようにしており、こちらを /etc/apt/apt.confに反映する。

Follow me!