現象
下記DockerfileでMySQLのDBコンテナ作成時に、エラーが出る。
FROM mysql:8.0-debian
RUN apt-get update && \
apt-get install -y procps && \
apt-get clean && \
rm -rf /var/lib/apt/lists/*
Reading package lists...
[91mW: GPG error: http://repo.mysql.com/apt/debian bullseye InRelease: The following signatures were invalid: EXPKEYSIG 467B942D3A79BD29 MySQL Release Engineering mysql-build@oss.oracle.com
E: The repository 'http://repo.mysql.com/apt/debian bullseye InRelease' is not signed.
つまり、署名が無効となっている、ということ。
原因
aptリポジトリの公開鍵が期限切れまたは無効になっている。
この問題は通常、外部リポジトリの鍵が更新されると発生する。
https://keyserver.ubuntu.com/
でエラーメッセージの「467B942D3A79BD29」を検索
2023-12-14T15:39:35Z
で期限切れしていることが分かる。
やりたいこと
EC2はコスト削減のためLambdaとEventBrigeを利用して、定時刻に自動的に停止、起動をしている。
EC2起動の際に、自動でshを起動させてDockerのimageとcontainerを削除して作り直している。
この仕組みの中で、MySQLの公開鍵を更新したい。
さらに、再度期限切れした時に対応しなくていいように、永続的な更新が出来るようにしたい。
対策
shを作成し、Dockerfileにコマンドを追加して、MySQLの公開鍵を更新する。
- update-mysql-key.sh
MySQLは
https://repo.mysql.com/RPM-GPG-KEY-mysql-2022
https://repo.mysql.com/RPM-GPG-KEY-mysql-2023
で公開鍵を提供してくれているようだが、2022や2023の部分を、可変で取得したい。
ここを可変で、「今年」にすることで、永続的に公開鍵を更新してくれるはず。
#!/bin/bash
set -eux
CURRENT_YEAR=$(date +"%Y")
wget https://repo.mysql.com/RPM-GPG-KEY-mysql-$CURRENT_YEAR -O- | apt-key add -
- Dockerfile-Mysql
DBコンテナはDockerfile-Mysqlで作っているので、それを修正
FROM mysql:8.0-debian
# MySQLのAPTリポジトリを一時的にコメントアウト
RUN sed -i '/repo.mysql.com/s/^/#/' /etc/apt/sources.list.d/mysql.list
# 必要なパッケージをインストール
RUN apt-get update && \
apt-get install -y wget gnupg procps && \
apt-get clean && \
rm -rf /var/lib/apt/lists/*
# スクリプトをコンテナにコピー
COPY update-mysql-key.sh /update-mysql-key.sh
# スクリプトを実行してMySQLの公開鍵を更新
RUN chmod +x /update-mysql-key.sh && \
/update-mysql-key.sh
# MySQLのAPTリポジトリのコメントアウトを解除
RUN sed -i '/repo.mysql.com/s/^#//' /etc/apt/sources.list.d/mysql.list
# 再びapt-get updateを実行(エラーが出るかもしれませんが、無視して大丈夫です)
RUN apt-get update || true
説明
1.公開鍵の更新前
aptリポジトリの公開鍵が古くなっているため、apt-get updateを実行すると、リポジトリの信頼性を確認できず、エラーが発生してしまう。
2.一時的な無効化
エラーを避けるため、まずリポジトリをコメントアウトで無効にし、その他の必要なパッケージ(例えば、wgetやgnupg)をインストールする。
3.公開鍵の更新
必要なツールがインストールされたら、スクリプトを実行して公開鍵を更新。
4.リポジトリの再有効化
公開鍵が更新された後、リポジトリをコメントアウトを解除して再度有効にし、通常通りapt-get updateを実行してシステムを更新する。
===
aptリポジトリの公開鍵を更新する必要があるのは、aptがリポジトリからパッケージを安全にダウンロードし、それらが信頼できるソースから来ていることを保証するため。
公開鍵は、リポジトリからのパッケージが改ざんされていないことを確認するために使用される。
Dockerfileの中でMySQLのaptリポジトリを一時的に無効にする(コメントアウトする)手順は、リポジトリの公開鍵が古くなっていて、apt-get update時にエラーを引き起こす場合に有用。
一時的にリポジトリを無効にするのは、公開鍵の問題を回避して、その他の必要なパッケージを安全にインストールするための一時的な措置であり、公開鍵が更新されれば、リポジトリは再び正常に機能するようになる。
注意
これは、
rpm-gpg-key-mysql-今年
で公開鍵が提供されるのであればうまく動くはず。
来年になってもちゃんと動くか確認したい。