L3w1s
L3w1s

Reputation: 306

Is there a way to convert a x86-only docker image to a multi-platform one?

The newest docker registry/engine have supported "manifest list" feature to allow user referencing images with different CPU architectures, OSes and other characteristics, by solo entry in registry.

So saying I have a legacy x86-only image in my repository ,and unfortunately it'd been altered during previous running as container (successive docker commits) which means no Dockerfile available. Is there a way I can convert this x86-only image to support manifest list without rebuilding it?

Upvotes: 1

Views: 675

Answers (1)

Matt
Matt

Reputation: 74650

Docker can export the contents of a container started from the image. Then a new image can be created FROM scratch that ADDs the contents back.

Steps

docker export will create a tar file of the complete contents of a container created from the image.

$ CID=$(docker create myimage)
$ docker export -o myimage.tar $CID
$ docker rm $CID

Build a new Dockerfile FROM scratch that ADDs the exported contents tar file back.

FROM scratch
ADD myimage.tar /

Any extended meta data for Dockerfile, like ENTRYPOINT, CMD or VOLUMES, can be queried via inspect or history:

$ docker image inspect myimage -f '{{json .Config}}' | jq
{
  "Hostname": "",
  "Domainname": "",
  "User": "",
  "AttachStdin": false,
  "AttachStdout": false,
  "AttachStderr": false,
  "ExposedPorts": {
    "27017/tcp": {}
  },
  "Tty": false,
  "OpenStdin": false,
  "StdinOnce": false,
  "Env": [
    "PATH=/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin",
    "GOSU_VERSION=1.10",
    "JSYAML_VERSION=3.10.0",
    "GPG_KEYS=2930ADAE8CAF5059EE73BB4B58712A2291FA4AD5",
    "MONGO_PACKAGE=mongodb-org",
    "MONGO_REPO=repo.mongodb.org",
    "MONGO_MAJOR=3.6",
    "MONGO_VERSION=3.6.3"
  ],
  "Cmd": [
    "mongod"
  ],
  "ArgsEscaped": true,
  "Image": "sha256:bac19e2cfd49108534b108c101a68a2046090d25da581ae04dc020aac93b4e31",
  "Volumes": {
    "/data/configdb": {},
    "/data/db": {}
  },
  "WorkingDir": "",
  "Entrypoint": [
    "docker-entrypoint.sh"
  ],
  "OnBuild": [],
  "Labels": null
}

or

docker image history myimage --no-trunc

Upvotes: 2

Related Questions