SML/NJのdockerイメージをマルチアーキテクチャ対応した

私が個人的に管理しているsml/njのdockerイメージを linux/amd64linux/386 のマルチアーキテクチャ対応しました。


以下のページでタグを確認すると、linux/amd64linux/386 という種類が表示されると思います。

> eldesh/smlnj/tags

使用方法

使用するにはそれぞれのアーキテクチャLinuxホストから任意のイメージをpullするだけ、つまり普通に使うだけです。
amd64版の方は全て 32/64bit モード両方でビルドしてありますので、sml -32(or -64) とすることで32bitモードでも使うことができますが、これは非ネイティブ動作(らしい)なので注意です*1

仕組み

docker registry は、各イメージ名に manifest というメタデータを関連付けており、ここに対応アーキテクチャ(やプラットフォーム)も含まれています。
ですので docker cli から適切なアーキテクチャを指定すればそのレイヤーがダウンロード出来るというワケです。

以下のように確認出来ます。(manifest は実験的な機能なので明示的に有効にしてやる必要があります。)

$ DOCKER_CLI_EXPERIMENTAL=enabled docker manifest inspect eldesh/smlnj:latest
{
   "schemaVersion": 2,
   "mediaType": "application/vnd.docker.distribution.manifest.list.v2+json",
   "manifests": [
      {
         "mediaType": "application/vnd.docker.distribution.manifest.v2+json",
         "size": 1157,
         "digest": "sha256:86983a83d1ef042bd3dbc1e013dad7845a566dc2afc3e52c17582f993a626af7",
         "platform": {
            "architecture": "386",
            "os": "linux"
         }
      },
      {
         "mediaType": "application/vnd.docker.distribution.manifest.v2+json",
         "size": 1158,
         "digest": "sha256:6d93f94070bf7877595f143f7f2ae7b3488e3740b2da35db17362a614f310a05",
         "platform": {
            "architecture": "amd64",
            "os": "linux"
         }
      }
   ]
}

*1:これに注意すべき人存在する気がしないけど