モヒカンメモ

髪色が定期的に変わることに定評のある(比較的)若者Webエンジニアの備忘録

DockerHub MySQLイメージのベースOSがOracleLinuxへ変わった件

タイミング的には2017年ぐらいのイベントだけど、歴史のあるプロジェクトを保守する時たまに踏むので備忘録がてらまとめておく。

DockerHub MySQLイメージのベースOSはOracleLinuxへ変わった

github.com

これまでのベース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:

hub.docker.com

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