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¶
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.
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
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 mitlatest
gekennzeichnet wird.- Zeile 8
baut die Images und stellt sie mit dem VFS-Treiber bereit.
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