diff --git a/_posts/2023-04-11-fabriquer-des-conteneurs-légers-depuis-une-ci-cd.md b/_posts/2023-04-11-fabriquer-des-conteneurs-légers-depuis-une-ci-cd.md index 21cb965..5cb7ba3 100644 --- a/_posts/2023-04-11-fabriquer-des-conteneurs-légers-depuis-une-ci-cd.md +++ b/_posts/2023-04-11-fabriquer-des-conteneurs-légers-depuis-une-ci-cd.md @@ -111,17 +111,81 @@ cp /tmp/oci/amd64/oci-layout /tmp/oci/multi/ # on copie les blobs mkdir -p /tmp/oci/multi/blobs/sha256/ cp -r /tmp/oci/{386,arm,arm64,amd64}/blobs/sha256/* /tmp/oci/multi/blobs/sha256/ - -# on recupere les blobs des manifests de chacune de nos images : -for a in amd64 arm arm64 386; do - F=$(jq -r '.manifests[0].digest' /tmp/oci/$a/index.json|grep -Po '[0-9a-f]+$'); - echo $a $'\t' $(stat -c %s /tmp/oci/$a/blobs/sha256/$F) $'\t' $F -done -# amd64 405 bc16dc0ab502dedbce06f16f51d46f7027271e20a378c7f2821bf5e000197523 -# arm 405 6d9017b7292a7922b410db767a9418accc700d529c9202d3c0155de10dc330cf -# arm64 405 18a092e389b2ee93d8170fed24a39bf1af38d2d05d7b6ee107d3af50b17f7dd0 -# 386 405 d88fd35b9c83baa3c8d61df4dc99a7c35346e493a2981d67d2d458652a5cac8f - ``` -Maintenant il ne nous reste plus qu'à créer un manifeste depuis les informations qu'on a collecté ! +Maintenant il ne nous reste plus qu'à créer un manifeste depuis les informations qu'on a collecté ! Pour se faire, deux choix : soit on copie, soit on va voir la spec. + +Pour copier, on peut aller zyeuter du côté d'une image officielle de Docker, comme celle de redis par exemple : + +```bash +docker manifest inspect redis:latest +``` + +Ce qui nous donne : + +```javascript +{ + "schemaVersion": 2, + "mediaType": "application/vnd.docker.distribution.manifest.list.v2+json", + "manifests": [ + { + "mediaType": "application/vnd.docker.distribution.manifest.v2+json", + "size": 1573, + "digest": "sha256:94a25c195c764f7962087eda247471989797001c222f079d5d4dbb1c34cc4854", + "platform": { + "architecture": "amd64", + "os": "linux" + } + }, + { + "mediaType": "application/vnd.docker.distribution.manifest.v2+json", + "size": 1573, + "digest": "sha256:8c6ff1f41fa800338843b4f6e1783faa1d3db95ac2c9e2ef2255ae01098349c8", + "platform": { + "architecture": "arm", + "os": "linux", + "variant": "v5" + } + }, + // ... + ] +} +``` + +L'autre option, c'est d'aller voir la specification OCI sur [les index d'images](https://github.com/opencontainers/image-spec/blob/main/image-index.md). + +À noter par contre que NixOS génère des manifests version 1 et non version 2, on peut s'en apercevoir en allant regarder l'index de nos images, exemple avec `/tmp/oci/amd64/index.json` : + +```json +{ + "schemaVersion": 2, + "manifests": [ + { + "mediaType": "application/vnd.oci.image.manifest.v1+json", + "digest": "sha256:bc16dc0ab502dedbce06f16f51d46f7027271e20a378c7f2821bf5e000197523", + "size": 405 + } + ] +} +``` + +En réalité, il nous faut simplement fusionner ces 4 fichiers d'index et les tagger avec la platform qui va bien ! Dans cet exemple, je vais le faire plus ou moins à la main avec `jq` : + +```bash +jq -s ' +{ + schemaVersion: 2, + mediaType: "application/vnd.docker.distribution.manifest.list.v2+json", + manifests: ( + [.[0].manifests[0] | .platform = { architecture:"amd64", os:"linux" }] + + [.[1].manifests[0] | .platform = { architecture:"arm64", os:"linux" }] + + [.[2].manifests[0] | .platform = { architecture:"arm", os:"linux" }] + + [.[3].manifests[0] | .platform = { architecture:"386", os:"linux" }] +)}' amd64/index.json arm64/index.json arm/index.json 386/index.json +``` + +Et voilà, notre image multi-arch devrait être prête ! + + + +