Multi-Arch-Images mit Buildah

Buildah erlaubt euch, Container-Images zu erstellen ohne dass ihr eine vollständige Container-Runtime benötigt. Buildah ist ein Open-Source-Tool auf Linux-Basis, das Docker- und Kubernetes-kompatible Images erstellen kann. Zudem kann Buildah nicht nur funktionierende Container von Grund auf neu erstellen, sondern auch aus einer bereits vorhandenen Dockerdatei. Schließlich lässt es sich leicht in Skripte und Build-Pipelines einbinden.

Erste Schritte

  1. Umgebungsvariablen einrichten

    DEPLOY_USER

    Name des Accounts.

    DEPLOY_KEY_FILE

    Pfad zu einem privaten SSH-Schlüssel, der zur Authentifizierung gegenüber dem Server verwendet werden soll.

    DEPLOY_HOST

    Hostname oder IP-Adresse des Servers, auf den verteilt werden soll.

  2. Einrichten der CI/CD-Pipeline

    .gitlab-ci.yml
     1stages:
     2  - build
     3  - deploy
     4
     5build_docker:
     6  stage: build
     7  variables:
     8    DOCKER_STEM: $CI_REGISTRY_IMAGE
     9  image: quay.io/buildah/stable:v1.27
    10  script:
    11    - apk add --no-cache openssh
    12    - chmod 0600 "$DEPLOY_KEY_FILE"
    13    - ./build.sh
    14
    15deploy_app:
    16  stage: deploy
    17  image: alpine
    18  environment:
    19    name: app
    20    deployment_tier: staging
    21  when: manual
    22  script:
    23    - apk add --no-cache openssh
    24    - chmod 0600 "$DEPLOY_KEY"
    25    - ./deploy.sh
    
  3. Bauen des Docker-Containers

    build.sh
    1# Registry login
    2echo "$CI_REGISTRY_PASSWORD" | buildah login -u "$CI_REGISTRY_USER" --password-stdin "$CI_REGISTRY"
    3
    4# Set docker tag
    5if [ "$CI_COMMIT_BRANCH" == main ]; then export DOCKER_TAG="latest"; else export DOCKER_TAG="${CI_COMMIT_TAG:-$CI_COMMIT_REF_SLUG}"; fi; export DOCKER_TAG_FULL="$DOCKER_STEM:$DOCKER_TAG"; echo "DOCKER_TAG_FULL=$DOCKER_TAG_FULL"
    6
    7# Build and push
    8buildah build --isolation chroot --storage-driver vfs --jobs 2 --platform linux/amd64,linux/arm/v7 --manifest "$DOCKER_TAG_FULL" && buildah --storage-driver vfs images && buildah manifest push --storage-driver vfs --format v2s2 --all "$DOCKER_TAG_FULL" "docker://$DOCKER_TAG_FULL"
    
    Zeile 2

    meldet sich bei der GitLab Package-Registry an.

    Zeile 5

    kennzeichnet die Images anhand ihrer Branch- oder Tag-Namen mit Ausnahme von main, der mit latest gekennzeichnet wird.

    Zeile 8

    baut die Images und stellt sie mit dem VFS-Treiber bereit.

  4. Bereitstellen

    deploy.sh
    1# Set docker tag
    2if [ "$CI_COMMIT_BRANCH" == main ]; then export DOCKER_TAG="latest"; else export DOCKER_TAG="${CI_COMMIT_TAG:-$CI_COMMIT_REF_SLUG}"; fi; export DOCKER_TAG_FULL="$DOCKER_STEM:$DOCKER_TAG"; echo "DOCKER_TAG_FULL=$DOCKER_TAG_FULL"
    3
    4echo "$CI_REGISTRY $DEPLOY_USER $DEPLOY_PASSWORD MYAPP $DOCKER_TAG" | ssh -o 'BatchMode yes' -o 'StrictHostKeyChecking accept-new' -i "$DEPLOY_KEY" root@$DEPLOY_HOST