Aus der Tasks-API wird ein deploybares Container-Image – in der GitLab Registry.
Wie erreicht ein Job einen Begleit-Container?
Services sind per Hostname erreichbar – dasselbe Muster nutzen wir gleich für docker:dind.
Um in einem Job ein Image zu bauen, braucht der Job selbst Zugriff auf einen Docker-Daemon. Den liefert ein
Service: docker:dind (Docker-in-Docker). Der Job nutzt das docker-CLI-Image
und spricht mit dem dind-Service.
build-image:
stage: build
image: docker:27-cli
services:
- docker:27-dind
script:
# 1) an der GitLab-Registry anmelden – Variablen liefert GitLab automatisch
- echo "$CI_REGISTRY_PASSWORD" | docker login $CI_REGISTRY -u "$CI_REGISTRY_USER" --password-stdin
# 2) bauen, getaggt mit dem Commit-SHA für Nachvollziehbarkeit
- docker build -t $CI_REGISTRY_IMAGE:$CI_COMMIT_SHORT_SHA -t $CI_REGISTRY_IMAGE:latest .
# 3) beide Tags pushen
- docker push $CI_REGISTRY_IMAGE:$CI_COMMIT_SHORT_SHA
- docker push $CI_REGISTRY_IMAGE:latest
CI_REGISTRY | Hostname der Registry |
CI_REGISTRY_IMAGE | Voller Image-Pfad dieses Projekts |
CI_REGISTRY_USER / _PASSWORD | Login für die Registry (job-gebunden, temporär) |
CI_COMMIT_SHORT_SHA | Kurzer Commit-Hash – ideal als Image-Tag |
Du brauchst kein eigenes Geheimnis einzurichten: Login-Daten und Registry-Pfad kommen automatisch aus dem Job-Kontext.
: und :latest) in der
Registry – nachvollziehbar, wer welchen Stand gebaut hat.
latest
:latest sagt nicht, welcher Code drin ist. Ein Tag mit
$CI_COMMIT_SHORT_SHA macht jedes Image eindeutig einem Commit zuordenbar – Gold wert beim
Debuggen von „was läuft gerade in Prod?".
rules aus Lektion 6 – z. B. nur auf main oder bei Tags.
Frage: Welche vordefinierte Variable gehört in docker push ___, um ins
richtige Projekt-Repository zu pushen?
$CI_REGISTRY_IMAGE (plus ein Tag, z. B. :latest). Sie enthält den
vollständigen Image-Pfad dieses Projekts in der Registry.
Aufgabe: Lass build-image nur auf dem Default-Branch laufen.
rules:
- if: $CI_COMMIT_BRANCH == $CI_DEFAULT_BRANCH
So entsteht ein Image nur für „echte" Stände auf main – nicht für jeden Feature-Push.
Frage: Warum ist docker:dind hier ein service und nicht das
image des Jobs?
Das Job-image (docker:27-cli) liefert das CLI, mit dem du Befehle
tippst. Der service (dind) liefert den Daemon, der die Images tatsächlich
baut. Beide zusammen ergeben „Docker im Job" – genau das Service-Muster aus Lektion 7.
Womit meldet sich der Job an der Registry an?
GitLab stellt CI_REGISTRY_USER/PASSWORD job-gebunden bereit – kein eigenes Secret nötig.
Warum zusätzlich mit dem Commit-SHA taggen?
latest ist mehrdeutig; ein SHA-Tag sagt exakt, welcher Commit drinsteckt.