Update Article “2023-04-11-fabriquer-des-conteneurs-légers-depuis-une-ci-cd”
All checks were successful
continuous-integration/drone/push Build is passing

This commit is contained in:
Quentin 2023-04-11 13:29:58 +00:00
parent ed2b11ee3e
commit e02ece0e5f

View file

@ -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 !