タイミング的には2017年ぐらいのイベントだけど、歴史のあるプロジェクトを保守する時たまに踏むので備忘録がてらまとめておく。
DockerHub MySQLイメージのベースOSはOracleLinuxへ変わった
これまでのベースOSは debian
だったが、2017年ぐらいに OracleLinux
へ変わった。
これに伴って mysql:5.7
のようにバージョン指定していた場合、変更以前はdebianベースのイメージが落ちてきていたけど今はOracleLinuxベースのイメージが落ちてくるようになる。そのため、Dockerfileとかで apt
( apt-get
) などのOracleLinuxに入っていないコマンドを叩くとエラーになってしまう。
エラーになる例
$ docker build --platform linux/amd64 --no-cache . [+] Building 0.8s (5/5) FINISHED docker:desktop-linux => [internal] load .dockerignore 0.0s => => transferring context: 2B 0.0s => [internal] load build definition from Dockerfile 0.0s => => transferring dockerfile: 115B 0.0s => [internal] load metadata for docker.io/library/mysql:5.7 0.6s => CACHED [1/2] FROM docker.io/library/mysql:5.7@sha256:f566819f2eee3a60cf5ea6c8b7d1bfc9de62 0.0s => ERROR [2/2] RUN apt-get update && apt-get install -y vim && apt-get clean 0.1s ------ > [2/2] RUN apt-get update && apt-get install -y vim && apt-get clean: 0.127 /bin/sh: apt-get: command not found ------ Dockerfile:3 -------------------- 1 | FROM mysql:5.7 2 | 3 | >>> RUN apt-get update && apt-get install -y vim && apt-get clean 4 | -------------------- ERROR: failed to solve: process "/bin/sh -c apt-get update && apt-get install -y vim && apt-get clean" did not complete successfully: exit code: 127
OracleLinuxのパッケージマネージャは apt
ではなく yum
なので、 apt
系のコマンドを叩くと command not found
となってしまう。
対策
(1) OracleLinuxで動くようにDockerfileを変更する
自分の知る限りでは大きな相違点でいうとパッケージマネージャがaptかyum (RHELベースだからdnfも使えるのかな?) かぐらいなので、debianからOracleLinuxへの移行はそこまで大変ではないように見える。
実際にやってみたわけではないので隠れめんどいポイントがあるかもしれない。
(2) debianベースのイメージを使うようにイメージ名を変更する
ベースOSを変えたらユーザが混乱することは容易に想像がつくので、debian版のイメージも用意されている。
DockerHub - MySQL 5.7:
mysql:5.7
としていたものを mysql:5.7-debian
のようにお尻に -debian
とつければdebianをベースOSとしたイメージが落ちてくる。
Dockerfileの修正例:
--- a/Dockerfile +++ b/Dockerfile @@ -1,3 +1,3 @@ -FROM mysql:5.7 +FROM mysql:5.7-debian RUN apt-get update && apt-get install -y vim && apt-get clean
Dockerビルド例
$ docker build --platform linux/amd64 --no-cache . [+] Building 8.5s (6/6) FINISHED docker:desktop-linux => [internal] load build definition from Dockerfile 0.0s => => transferring dockerfile: 122B 0.0s => [internal] load .dockerignore 0.0s => => transferring context: 2B 0.0s => [internal] load metadata for docker.io/library/mysql:5.7-debian 1.5s => CACHED [1/2] FROM docker.io/library/mysql:5.7-debian@sha256:0821f3a5b3ecda79885d8bd40ec35 0.0s => [2/2] RUN apt-get update && apt-get install -y vim && apt-get clean 6.8s => exporting to image 0.1s => => exporting layers 0.1s => => writing image sha256:8b578dbed59f832ec67ff9d07c118038b1a814a93cb330e81fcba55478a21218 0.0s