99 lines
3.8 KiB
Markdown
99 lines
3.8 KiB
Markdown
# Images pinnen: de commando's
|
|||
|
|
|
||
|
|
Naslag, geen plan. Wanneer dit gedaan wordt en waarom staat in het masterplan **Publicatie**; hier staan
|
||
|
|
alleen de commando's en wat je uit de uitvoer moet halen.
|
||
|
|
|
||
|
|
Alles hieronder draait **op de Umbrel**, want daar staat Docker. Lukt een commando niet, zet er dan `sudo`
|
||
|
|
voor.
|
||
|
|
|
||
|
|
## Waarom het niet één commando is
|
||
|
|
|
||
|
|
De eis is `repo:versie@sha256:<digest>`, en daar zitten drie dingen in die elk apart mis kunnen gaan:
|
||
|
|
|
||
|
|
- **de tag moet specifiek zijn.** `python:3-alpine` beweegt mee met elke nieuwe 3.x en is ook mét digest
|
||
|
|
niet toegestaan. Stap 1 zoekt uit welke versie er nu achter zit;
|
||
|
|
- **de digest moet die van de index zijn**, niet die van één architectuur. Een platform-digest werkt op de
|
||
|
|
machine waar je hem ophaalt en breekt op de andere; een Umbrel Home is arm64 en een zelfbouw meestal
|
||
|
|
amd64;
|
||
|
|
- **beide architecturen moeten erin zitten.** Dat lees je in dezelfde uitvoer af.
|
||
|
|
|
||
|
|
## Stap 1: welke versie zit er achter de bewegende tag
|
||
|
|
|
||
|
|
```bash
|
||
|
|
docker run --rm python:3-alpine python -V
|
||
|
|
```
|
||
|
|
|
||
|
|
```bash
|
||
|
|
docker run --rm nginx:alpine nginx -v
|
||
|
|
```
|
||
|
|
|
||
|
|
De uitvoer noemt bijvoorbeeld `Python 3.13.7` en `nginx version: nginx/1.27.4`. Gebruik daarvan alleen het
|
||
|
|
eerste deel in de tag, dus `python:3.13-alpine` en `nginx:1.27-alpine`, en niet de derde cijfergroep: een
|
||
|
|
patchversie-tag bestaat niet altijd, en de tweede cijfergroep is specifiek genoeg om niet mee te bewegen
|
||
|
|
met een nieuwe hoofdversie.
|
||
|
|
|
||
|
|
## Stap 2: de index-digest van die tag
|
||
|
|
|
||
|
|
```bash
|
||
|
|
docker buildx imagetools inspect python:3.13-alpine
|
||
|
|
```
|
||
|
|
|
||
|
|
```bash
|
||
|
|
docker buildx imagetools inspect nginx:1.27-alpine
|
||
|
|
```
|
||
|
|
|
||
|
|
Twee dingen uit die uitvoer, en let op welke digest je pakt:
|
||
|
|
|
||
|
|
```
|
||
|
|
Name: docker.io/library/python:3.13-alpine
|
||
|
|
MediaType: application/vnd.oci.image.index.v1+json
|
||
|
|
Digest: sha256:AAAA... <- deze, de bovenste
|
||
|
|
Manifests:
|
||
|
|
Name: docker.io/library/python:3.13-alpine@sha256:BBBB...
|
||
|
|
Platform: linux/amd64 <- deze moet erin staan
|
||
|
|
Name: docker.io/library/python:3.13-alpine@sha256:CCCC...
|
||
|
|
Platform: linux/arm64 <- en deze ook
|
||
|
|
```
|
||
|
|
|
||
|
|
De bovenste `Digest:` is de manifest-lijst en die hoort in de compose. De digests bij `Manifests:` zijn per
|
||
|
|
platform; dat is precies de verwisseling die pas op de andere architectuur opvalt.
|
||
|
|
|
||
|
|
## Stap 2b: als `buildx` er niet is
|
||
|
|
|
||
|
|
```bash
|
||
|
|
docker pull python:3.13-alpine
|
||
|
|
```
|
||
|
|
|
||
|
|
```bash
|
||
|
|
docker image inspect --format '{{index .RepoDigests 0}}' python:3.13-alpine
|
||
|
|
```
|
||
|
|
|
||
|
|
Een `docker pull` van een tag met meerdere architecturen zet de index-digest in `RepoDigests`, dus dit
|
||
|
|
levert dezelfde waarde op als stap 2.
|
||
|
|
|
||
|
|
**Maar het bewijst niets over de architecturen, en dat is hier geen theoretisch punt.** De Umbrel van de
|
||
|
|
gebruiker is amd64 (`OS: Linux 6.12.85+deb13-amd64`, uit de nginx-startlog van 20-08-2026). Een `docker pull`
|
||
|
|
daar haalt de amd64-variant en zegt niets over arm64, terwijl arm64 wel een eis is en de helft van de
|
||
|
|
Umbrels erop draait. Gebruik dus stap 2 als het kan, en zie deze terugval als "de digest opzoeken", niet als
|
||
|
|
"de eis controleren".
|
||
|
|
|
||
|
|
Terzijde, uit diezelfde log: achter `nginx:alpine` zat op 20-08-2026 **nginx 1.31.4**. Stap 1 hoeft daarvoor
|
||
|
|
dus niet eens gedraaid te worden zolang de app draait; `docker logs` van de server-container noemt de versie
|
||
|
|
bij elke start.
|
||
|
|
|
||
|
|
## Stap 3: de pin in de repo
|
||
|
|
|
||
|
|
Plak de uitvoer van stap 2 in de sessie. De pin gaat dan in `docker-compose.yml`:
|
||
|
|
|
||
|
|
```yaml
|
||
|
|
image: python:3.13-alpine@sha256:AAAA...
|
||
|
|
```
|
||
|
|
|
||
|
|
Dat is een gewone commit **met een versieverhoging** in `umbrel-app.yml`, want de compose staat in de
|
||
|
|
update-whitelist en wordt dus daadwerkelijk uitgerold.
|
||
|
|
|
||
|
|
## Stap 4: het is onderhoud, geen eenmalige handeling
|
||
|
|
|
||
|
|
Een gepinde image krijgt geen beveiligingsupdates meer tot iemand de pin verhoogt. Deze vier stappen horen
|
||
|
|
daarom bij elke release opnieuw gedaan te worden, niet één keer bij de inlevering.
|