forked from quentin/quentin.dufour.io
Update Article “2023-04-11-fabriquer-des-conteneurs-légers-depuis-une-ci-cd”
This commit is contained in:
parent
ed2b11ee3e
commit
e02ece0e5f
1 changed files with 76 additions and 12 deletions
|
@ -111,17 +111,81 @@ cp /tmp/oci/amd64/oci-layout /tmp/oci/multi/
|
||||||
# on copie les blobs
|
# on copie les blobs
|
||||||
mkdir -p /tmp/oci/multi/blobs/sha256/
|
mkdir -p /tmp/oci/multi/blobs/sha256/
|
||||||
cp -r /tmp/oci/{386,arm,arm64,amd64}/blobs/sha256/* /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 !
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
Loading…
Reference in a new issue