Container bauen mit Kaniko

Warum mit Kaniko bauen?

Wer bisher Container baut, tut dies in der Regel mithilfe des Docker Daemons. Dieser läuft aber mit root Rechten auf dem Rechner. Das stellt also ein Sicherheitsrisiko dar, welches wir gern vermeiden wollen. Ausserdem können wir ohne den Daemon auch einfacher Container direkt in Kubernetes bauen.

Kaniko selbst läuft demnach auch in einem Container, so ist auch das ausprobieren für uns wieder einfach, ohne unseren Rechner zu verschmutzen.

Kaniko Lifecycle

kaniko workflow

Erster Schritt

Als kleines Beispiel nutzen wir folgendes mini Dockerfile.


FROM alpine:3.9
RUN apk add --no-cache nginx

Ausserdem legen wir eine Datei namens auth.json an um Kaniko die Möglichkeit zu geben, direkt in eine Registry zu pushen.

Natürlich muss hier das Auth-Token zum Account passen.
So wirds erzeugt: echo -n 'bee42:secret-password' | base64

{
    "auths": {
        "https://index.docker.io/v1/": {
            "auth": "YmVlNDI6c2VjcmV0LXBhc3N3b3Jk"
        }
    }
}

Diese Datei mounten wir nun mit in unseren Kaniko Container:

docker run \
    -v $(pwd):/workspace \
    -v $(pwd)/auth.json:/kaniko/.docker/config.json \
    gcr.io/kaniko-project/executor:latest \
    --dockerfile Dockerfile --destination "bee42/kaniko-test" --tarPath "/workspace/kaniko-image.tar" --context dir:///workspace/

Da wir die Flag --tarPath angegeben haben, wird unser Image lokal als kaniko-image.tar gespeichert und wir können es mit Docker importieren.

Wie wir sehen, funktioniert zwar alles, es dauert aber doch recht lang.

Kaniko kann aber, ebenso wie wir es vom Docker Daemon gewöhnt sind, Layer cachen.

Tuning

Um nun das Layer Caching zu nutzen braucht Kaniko ein wenig Nachhilfe. Dazu ändern wir unseren Befehl wie folgt:

docker run \
    -v $(pwd):/workspace \
    -v $(pwd)/auth.json:/kaniko/.docker/config.json \
    -v $(pwd)/kaniko/cache:/cache \
    gcr.io/kaniko-project/executor:latest \
    --cache-repo "bee42/kata-cache" \
    --dockerfile Dockerfile.kaniko --cache  \
    --destination "bee42/kata-test"  --context dir:///workspace/

Wir haben also die --cache flag angegeben. Dadurch erwartet Kaniko ausserdem ein Repo, indem die Cache Layer gespeichert werden können. Dieses wird dann mit --cache-repo "bee42/kaniko-cache" spezifiziert. Ausserdem mounten wir den Order /cache im lokalen Filesystem um den Prozess weiter zu beschleunigen.
Im obigen Befehl haben wir keinen lokalen Path angegeben, da wir nun mit --destination ein Repository angeben,in welches das Image direkt gepusht wird. Um eine andere Registry zu wählen, kann man den Inhalt der auth.json anpassen.

Fazit

Wir sehen, dass Kaniko noch nicht so intuitiv und einfach zu benutzen ist, wie es mit dem Docker Daemon geht, aber eine durchaus praktikable Alternative darstellt um Container Images zu bauen.

Ausserdem ist es bei weitem nicht die einzige Alternative, OCI Images zu bauen. Hier findet ihr noch ein paar weitere Möglichkeiten, wie man fernab von Docker Inc. Images bauen kann:

  • Jib ist eine Alternative extra für Java, welche besonders hohe Schnelligkeit, daemonless und sogar repeatable builds bieten will.
  • Orca baut direkt auf runc auf. Ebenfalls ohne root und daemon.
  • Introduction von Kaniko

"Um unsere Webseite für Sie optimal zu gestalten und fortlaufend verbessern zu können, verwenden wir Cookies. Durch die weitere Nutzung der Webseite stimmen Sie der Verwendung von Cookies zu. Weitere Informationen zu Cookies erhalten Sie in unserer Datenschutzerklärung."