Neuigkeiten von trion.
Immer gut informiert.

Jib CLI - Docker Images ohne Dämon

Jib CLI - Docker Images ohne Dämon bauen

Aus dem Java Umfeld stammt das Werkzeug Jib, mit dem sich Anwedungen in optimierte Docker / OCI Container Images verwandeln lassen. Typischerweise wird Jib zusammen mit dem Buildsystem der Anwendung, z.B. maven oder gradle, verwendet.

Doch nun hat Google Jib auch als Kommandozeilenwerkzeug (CLI) in einer ersten Version bereitgestellt. Damit lässt sich Jib auch für andere Arten von Containern einsetzen.

Jib selbst kann von der GitHub Release Webseite bezogen werden: https://github.com/GoogleContainerTools/jib/releases Zur Ausführung benötigt Jib eine Java Laufzeitumgebung, das kann wiederum in einem Container laufen.

Die Konfiguration des durch Jib erstellen Docker oder OCI Image wird dabei durch eine YAML Konfigurationsdatei definiert: Da kein Docker zum Einsatz kommt, wird entsprechend auch kein Dockerfile verwendet. Jib kümmert sich dabei lediglich um die Erstellung der einzelnen Image Layer und erlaubt eine sehr flexible und feingranulare Steuerung der einzelnen Layer.

Das ist auch sinnvoll: Nur so kann ein optimales Caching von Docker Images erzielt werden und damit der erforderliche Speicherplatz und die benötigte Bandbreite minimal gehalten werden.

Anders, als bei Dockerfile, ist es jedoch nicht möglich, Instruktionen auszuführen. Die gesamten Inhalte für das Image müssen also separat erstellt werden.

Jib CLI eignet sich damit hervorragend, um in einer Build bzw. CI-Pipeline zum Einsatz zu kommen. Denn gerade in einer CI Umgebung hat die Verwendung von Docker oft Auswirkungen auf die Performance oder Sicherheit der Umgebung.

Im folgenden ist ein Beispiel zu sehen, wie ein nginx Container erstellt wird, der zur Auslieferung einer Datei via HTTP in einer Kubernetes Umgebung eingesetzt wird.
Die Konfiguration von Jib definiert zunächst das Basisimage und die Plattform bzw. Plattformen. Danach kommen dann grundsätzliche Konfiguration und Metadaten für das Image, wie Erstellzeitpunkt, das zu verwendende Zielformat, Umgebungsvariablen und Ports für den späteren Container und Label.

Anschließend kann jeder einzelne Layer konfiguriert werden. Dabei werden die Quelldateien und Zielpositionen sowie Zeitstempel und Permissions für die Dateien je Layer konfiguriert. Damit ist es möglich, ganz gezielt die weniger variablen Daten in frühen Layern zu positionieren, während häufig veränderte Daten weiter hinten verortet werden. Damit müssen bei Aktualisierungen nicht alle Layer neu übertragen und gespeichert werden.

Beispiel Jib YAML zum Build eines nginx Containers
apiVersion: jib/v1alpha1
kind: BuildFile

from:
  image: "nginx:alpine"
  platforms:
    - architecture: "amd64"
      os: "linux"

creationTime: 2000
format: OCI # Docker or OCI
environment:
  "db": "v1"
labels:
  "maxmind": "geocitylite"
# volumes:
#   - "/volume1"

exposedPorts:
  - "80"

#user: "customUser"
#workingDirectory: "/home"
# entrypoint:
#   - "sh"
#   - "script.sh"
# cmd:
#   - "--param"
#   - "param"

# file layers of the container
layers:
  properties:
    filePermissions: "644"
    directoryPermissions: "755"
    user: "0"
    group: "0"
    timestamp: "3000"
  entries:
    - name: "db"
      properties:
        filePermissions: "644"
      files:
        - src: "../../GeoLite2-City.mmdb"
          dest: "/usr/share/nginx/html/GeoLite2-City.mmdb"
          # excludes:
          #   - "**/exclude.me"
          #   - "**/*.ignore"
          # includes:
          #   - "**/include.me"
          properties:
            filePermissions: "644"

Das Jib CLI kann auf der Kommandozeile, oder als Teil eines Buildschrittes aufgerufen werden und dabei Ziel Registry, Repository, Image und Tag sowie, falls erforderlich, die Credentials als Parameter erhalten:

$ jib build
--to-username ${REGISTRY_USERNAME} --to-password ${REGISTRY_PASSWORD} \
--target=registry.example.com/trion/demo:latest

Im Beispiel oben werden die Container Registry Credentials durch Umgebungsvariablen bereitgestellt, könnten aber genauso direkt spezifiziert sein.

Jib zeichnet sich durch schnelle Builds und flexible und unkomplizierte Integration in die unterschiedlichsten Abläufe aus. Da Jib auf Java aufsetzt, ist ein plattformübergreifender Einsatz besonders einfach möglich.




Zu den Themen Kubernetes, Docker und Cloud Architektur bieten wir sowohl Beratung, Entwicklungsunterstützung als auch passende Schulungen an:

Auch für Ihren individuellen Bedarf können wir Workshops und Schulungen anbieten. Sprechen Sie uns gerne an.

Feedback oder Fragen zu einem Artikel - per Twitter @triondevelop oder E-Mail freuen wir uns auf eine Kontaktaufnahme!

Zur Desktop Version des Artikels