Skip to main content

Veröffentlichen von Docker-Images

Du kannst Docker-Images im Rahmen Deines Workflows zur kontinuierlichen Integration (CI) in einer Registry wie zum Beispiel „Docker Hub“ oder GitHub Packages veröffentlichen.

Einführung

Diese Anleitung zeigt Dir, wie Du einen Workflow erstellen kannst, der einen Docker-Build ausführt und dann Docker-Images auf „Docker Hub“ oder GitHub Packages veröffentlicht. Mit einem einzelnen Workflow kannst Du Images in einer einzigen Registry oder in mehreren Registries veröffentlichen.

Note

Das Beispiel im Abschnitt Veröffentlichen von Images in GitHub Packages dient als gute Vorlage für ein Szenario, in dem du ein Image an eine Docker-Drittanbieterregistrierung pushen möchtest.

Voraussetzungen

Wir empfehlen, dass Du ein grundlegendes Verständnis von Workflowkonfigurations-Optionen hast und darüber, wie Du eine Workflow-Datei erstellst. Weitere Informationen findest du unter Schreiben von Workflows.

Vielleicht findest Du es auch hilfreich, ein grundlegendes Verständnis von Folgendem zu haben:

Informationen zur Image-Konfiguration

In dieser Anleitung wird davon ausgegangen, dass Du eine vollständige Definition für ein Docker-Image in einem GitHub-Repository gespeichert hast. Dein Repository muss beispielsweise ein Dockerfile und alle anderen Dateien enthalten, die benötigt werden, um einen Docker-Build zum Erstellen eines Images durchzuführen.

Du kannst deinem Containerimage mithilfe von vordefinierten Anmerkungsschlüsseln Metadaten hinzufügen, z. B. eine Beschreibung, eine Lizenz und ein Quellrepository. Weitere Informationen findest du unter Arbeiten mit der Containerregistrierung.

In diesem Leitfaden wird die Docker-Aktion build-push-action verwendet, um das Docker-Image zu erstellen und an eine oder mehrere Registrierungen zu pushen. Weitere Informationen findest du unter build-push-action.

Images auf dem „Docker Hub“ veröffentlichen

Jedes Mal, wenn du auf GitHub ein neues Release erstellst, kannst du einen Workflow auslösen, um dein Image zu veröffentlichen. Der Workflow im folgenden Beispiel wird ausgeführt, wenn das release-Ereignis mit dem published-Aktivitätstyp ausgelöst wird.

Im folgenden Beispielworkflow werden die Docker-Aktionen login-action und build-push-action verwendet, um das Docker-Image zu erstellen und bei erfolgreicher Erstellung an Docker Hub zu pushen.

Um zum „Docker Hub“ zu pushen, benötigst Du ein Benutzerkonto auf „Docker Hub“ und musst ein „Docker Hub“-Repository erstellt haben. Weitere Informationen findest du unter Pushen eines Docker-Containerimages an Docker Hub in der Docker-Dokumentation.

Für Docker Hub sind die folgenden login-action-Optionen erforderlich:

  • username und password: Dies ist dein Benutzername und dein Kennwort für Docker Hub. Es wird empfohlen, deinen Benutzernamen und dein Kennwort für Docker Hub als Geheimnisse zu speichern, damit sie nicht in deiner Workflowdatei verfügbar gemacht werden. Weitere Informationen findest du unter Verwenden von Geheimnissen in GitHub-Aktionen.

Für Docker Hub ist die folgende metadata-action-Option erforderlich:

  • images: Dies ist der Namespace und der Name für das Docker-Image, das du erstellst bzw. an Docker Hub pushst.

Für Docker Hub sind die folgenden build-push-action-Optionen erforderlich:

  • tags: Dies ist das Tag deines neuen Images im Format DOCKER-HUB-NAMESPACE/DOCKER-HUB-REPOSITORY:VERSION. Du kannst wie im Folgenden gezeigt ein einzelnes Tag festlegen oder mehrere Tags in einer Liste angeben.
  • push: Wenn diese Option auf true festgelegt ist, wird das Image bei erfolgreicher Erstellung an die Registrierung gepusht.
YAML
# Dieser Workflow verwendet Aktionen, die nicht von GitHub zertifiziert sind.
# Sie werden von einem Drittanbieter bereitgestellt und unterliegen
# separaten Nutzungsbedingungen, Datenschutzbestimmungen und Support
# Onlinedokumentation.

# GitHub empfiehlt, Aktionen an einen Commit-SHA anzuheften.
# Um eine neuere Version zu erhalten, musst du den SHA aktualisieren.
# Du kannst auch auf ein Tag oder einen Branch verweisen, aber die Aktion kann sich ohne Vorwarnung ändern.

name: Publish Docker image

on:
  release:
    types: [published]

jobs:
  push_to_registry:
    name: Push Docker image to Docker Hub
    runs-on: ubuntu-latest
    permissions:
      packages: write
      contents: read
      attestations: write
      id-token: write
    steps:
      - name: Check out the repo
        uses: actions/checkout@v4

      - name: Log in to Docker Hub
        uses: docker/login-action@f4ef78c080cd8ba55a85445d5b36e214a81df20a
        with:
          username: ${{ secrets.DOCKER_USERNAME }}
          password: ${{ secrets.DOCKER_PASSWORD }}

      - name: Extract metadata (tags, labels) for Docker
        id: meta
        uses: docker/metadata-action@9ec57ed1fcdbf14dcef7dfbe97b2010124a938b7
        with:
          images: my-docker-hub-namespace/my-docker-hub-repository

      - name: Build and push Docker image
        id: push
        uses: docker/build-push-action@3b5e8027fcad23fda98b2e3ac259d8d67585f671
        with:
          context: .
          file: ./Dockerfile
          push: true
          tags: ${{ steps.meta.outputs.tags }}
          labels: ${{ steps.meta.outputs.labels }}

      - name: Generate artifact attestation
        uses: actions/attest-build-provenance@v1
        with:
          subject-name: ${{ env.REGISTRY }}/${{ env.IMAGE_NAME}}
          subject-digest: ${{ steps.push.outputs.digest }}
          push-to-registry: true

Der obige Workflow checkt das GitHub-Repository aus, verwendet login-action für die Anmeldung bei der Registrierung und nutzt dann die build-push-action-Aktion, um basierend auf der Dockerfile deines Repositorys ein Docker-Image zu erstellen, dieses an Docker Hub zu pushen und ein Tag auf das Image anzuwenden.

Im letzten Schritt generiert es einen Artefaktnachweis für das Bild, wodurch die Lieferkettensicherheit erhöht wird. Weitere Informationen findest du unter Verwenden von Artefaktnachweisen zur Ermittlung der Herkunft von Builds.

Images in GitHub Packages veröffentlichen

Jedes Mal, wenn du auf GitHub ein neues Release erstellst, kannst du einen Workflow auslösen, um dein Image zu veröffentlichen. Der Workflow im folgenden Beispiel wird ausgeführt, wenn eine Änderung an die release-Verzweigung gepusht wird.

Im folgenden Beispielworkflow werden die Docker-Aktionen login-action, metadata-action, und build-push-action verwendet, um das Docker-Image zu erstellen und dieses bei erfolgreicher Erstellung an GitHub Packages zu pushen.

Für GitHub Packages sind die folgenden login-action-Optionen erforderlich:

Für GitHub Packages ist die folgende metadata-action-Option erforderlich:

  • images: Dies ist der Namespace und der Name für das Docker-Image, das du erstellst.

Für GitHub Packages sind die folgenden build-push-action-Optionen erforderlich:

  • context: Hiermit wird der Kontext des Builds als Gruppe von Dateien im angegebenen Pfad definiert.
  • push: Wenn diese Option auf true festgelegt ist, wird das Image bei erfolgreicher Erstellung an die Registrierung gepusht.
  • tags und labels: Diese Optionen werden über die Ausgabe von metadata-action ausgefüllt.

Note

  • Dieser Workflow verwendet Aktionen, die nicht von GitHub zertifiziert wurden. Sie werden von einem Drittanbieter bereitgestellt und unterliegen separaten Nutzungsbedingungen, Datenschutzrichtlinien und Supportdokumentationen.
  • GitHub empfiehlt das Anheften von Aktionen an einen Commit-SHA. Um eine neuere Version zu erhalten, musst du den SHA aktualisieren. Du kannst auch auf ein Tag oder einen Branch verweisen, aber die Aktion kann sich ohne Vorwarnung ändern.
YAML
name: Create and publish a Docker image
on:
  push:
    branches: ['release']

Configures this workflow to run every time a change is pushed to the branch called release.

env:
  REGISTRY: ghcr.io
  IMAGE_NAME: ${{ github.repository }}

Defines two custom environment variables for the workflow. These are used for the Container registry domain, and a name for the Docker image that this workflow builds.

jobs:
  build-and-push-image:
    runs-on: ubuntu-latest

There is a single job in this workflow. It's configured to run on the latest available version of Ubuntu.

    permissions:
      contents: read
      packages: write
      attestations: write
      id-token: write

Sets the permissions granted to the GITHUB_TOKEN for the actions in this job.

    steps:
      - name: Checkout repository
        uses: actions/checkout@v4
      - name: Log in to the Container registry
        uses: docker/login-action@65b78e6e13532edd9afa3aa52ac7964289d1a9c1
        with:
          registry: ${{ env.REGISTRY }}
          username: ${{ github.actor }}
          password: ${{ secrets.GITHUB_TOKEN }}

Uses the docker/login-action action to log in to the Container registry registry using the account and password that will publish the packages. Once published, the packages are scoped to the account defined here.

      - name: Extract metadata (tags, labels) for Docker
        id: meta
        uses: docker/metadata-action@9ec57ed1fcdbf14dcef7dfbe97b2010124a938b7
        with:
          images: ${{ env.REGISTRY }}/${{ env.IMAGE_NAME }}

This step uses docker/metadata-action to extract tags and labels that will be applied to the specified image. The id "meta" allows the output of this step to be referenced in a subsequent step. The images value provides the base name for the tags and labels.

      - name: Build and push Docker image
        id: push
        uses: docker/build-push-action@f2a1d5e99d037542a71f64918e516c093c6f3fc4
        with:
          context: .
          push: true
          tags: ${{ steps.meta.outputs.tags }}
          labels: ${{ steps.meta.outputs.labels }}

This step uses the docker/build-push-action action to build the image, based on your repository's Dockerfile. If the build succeeds, it pushes the image to GitHub Packages. It uses the context parameter to define the build's context as the set of files located in the specified path. For more information, see "Usage" in the README of the docker/build-push-action repository. It uses the tags and labels parameters to tag and label the image with the output from the "meta" step.

      - name: Generate artifact attestation
        uses: actions/attest-build-provenance@v2
        with:
          subject-name: ${{ env.REGISTRY }}/${{ env.IMAGE_NAME}}
          subject-digest: ${{ steps.push.outputs.digest }}
          push-to-registry: true

This step generates an artifact attestation for the image, which is an unforgeable statement about where and how it was built. It increases supply chain security for people who consume the image. For more information, see "Verwenden von Artefaktnachweisen zur Ermittlung der Herkunft von Builds."

#
name: Create and publish a Docker image

# Configures this workflow to run every time a change is pushed to the branch called `release`.
on:
  push:
    branches: ['release']

# Defines two custom environment variables for the workflow. These are used for the Container registry domain, and a name for the Docker image that this workflow builds.
env:
  REGISTRY: ghcr.io
  IMAGE_NAME: ${{ github.repository }}

# There is a single job in this workflow. It's configured to run on the latest available version of Ubuntu.
jobs:
  build-and-push-image:
    runs-on: ubuntu-latest
    # Sets the permissions granted to the `GITHUB_TOKEN` for the actions in this job.
    permissions:
      contents: read
      packages: write
      attestations: write
      id-token: write
      # 
    steps:
      - name: Checkout repository
        uses: actions/checkout@v4
      # Uses the `docker/login-action` action to log in to the Container registry registry using the account and password that will publish the packages. Once published, the packages are scoped to the account defined here.
      - name: Log in to the Container registry
        uses: docker/login-action@65b78e6e13532edd9afa3aa52ac7964289d1a9c1
        with:
          registry: ${{ env.REGISTRY }}
          username: ${{ github.actor }}
          password: ${{ secrets.GITHUB_TOKEN }}
      # This step uses [docker/metadata-action](https://github.com/docker/metadata-action#about) to extract tags and labels that will be applied to the specified image. The `id` "meta" allows the output of this step to be referenced in a subsequent step. The `images` value provides the base name for the tags and labels.
      - name: Extract metadata (tags, labels) for Docker
        id: meta
        uses: docker/metadata-action@9ec57ed1fcdbf14dcef7dfbe97b2010124a938b7
        with:
          images: ${{ env.REGISTRY }}/${{ env.IMAGE_NAME }}
      # This step uses the `docker/build-push-action` action to build the image, based on your repository's `Dockerfile`. If the build succeeds, it pushes the image to GitHub Packages.
      # It uses the `context` parameter to define the build's context as the set of files located in the specified path. For more information, see "[Usage](https://github.com/docker/build-push-action#usage)" in the README of the `docker/build-push-action` repository.
      # It uses the `tags` and `labels` parameters to tag and label the image with the output from the "meta" step.
      - name: Build and push Docker image
        id: push
        uses: docker/build-push-action@f2a1d5e99d037542a71f64918e516c093c6f3fc4
        with:
          context: .
          push: true
          tags: ${{ steps.meta.outputs.tags }}
          labels: ${{ steps.meta.outputs.labels }}
      
      # This step generates an artifact attestation for the image, which is an unforgeable statement about where and how it was built. It increases supply chain security for people who consume the image. For more information, see "[AUTOTITLE](/actions/security-guides/using-artifact-attestations-to-establish-provenance-for-builds)." 
      - name: Generate artifact attestation
        uses: actions/attest-build-provenance@v2
        with:
          subject-name: ${{ env.REGISTRY }}/${{ env.IMAGE_NAME}}
          subject-digest: ${{ steps.push.outputs.digest }}
          push-to-registry: true
      

Der obige Workflow wird durch einen Push an den Branch „release“ ausgelöst. Das GitHub-Repository wird ausgecheckt, und login-action wird für die Anmeldung bei der Container registry verwendet. Anschließend werden Bezeichnungen und Tags für das Docker-Image extrahiert. Schließlich wird die build-push-action-Aktion verwendet, um das Image zu erstellen und in der Container registry zu veröffentlichen.

Images auf dem „Docker Hub“ und in der GitHub Packages veröffentlichen

Du kannst dein Docker-Image mithilfe der Aktionen login-action und build-push-action für jede Registrierung in einem einzigen Workflow an mehrere Registrierungen pushen.

Im folgenden Beispielworkflow werden die Schritte aus den vorherigen Abschnitten (Veröffentlichen von Images in Docker Hub und Veröffentlichen von Images in der GitHub Packages) verwendet, um einen einzelnen Workflow zu erstellen, der an beide Registrierungen pusht.

YAML
# Dieser Workflow verwendet Aktionen, die nicht von GitHub zertifiziert sind.
# Sie werden von einem Drittanbieter bereitgestellt und unterliegen
# separaten Nutzungsbedingungen, Datenschutzbestimmungen und Support
# Onlinedokumentation.

# GitHub empfiehlt, Aktionen an einen Commit-SHA anzuheften.
# Um eine neuere Version zu erhalten, musst du den SHA aktualisieren.
# Du kannst auch auf ein Tag oder einen Branch verweisen, aber die Aktion kann sich ohne Vorwarnung ändern.

name: Publish Docker image

on:
  release:
    types: [published]

jobs:
  push_to_registries:
    name: Push Docker image to multiple registries
    runs-on: ubuntu-latest
    permissions:
      packages: write
      contents: read
      attestations: write
      id-token: write
    steps:
      - name: Check out the repo
        uses: actions/checkout@v4

      - name: Log in to Docker Hub
        uses: docker/login-action@f4ef78c080cd8ba55a85445d5b36e214a81df20a
        with:
          username: ${{ secrets.DOCKER_USERNAME }}
          password: ${{ secrets.DOCKER_PASSWORD }}

      - name: Log in to the Container registry
        uses: docker/login-action@65b78e6e13532edd9afa3aa52ac7964289d1a9c1
        with:
          registry: ghcr.io
          username: ${{ github.actor }}
          password: ${{ secrets.GITHUB_TOKEN }}

      - name: Extract metadata (tags, labels) for Docker
        id: meta
        uses: docker/metadata-action@9ec57ed1fcdbf14dcef7dfbe97b2010124a938b7
        with:
          images: |
            my-docker-hub-namespace/my-docker-hub-repository
            ghcr.io/${{ github.repository }}

      - name: Build and push Docker images
        id: push
        uses: docker/build-push-action@3b5e8027fcad23fda98b2e3ac259d8d67585f671
        with:
          context: .
          push: true
          tags: ${{ steps.meta.outputs.tags }}
          labels: ${{ steps.meta.outputs.labels }}

      - name: Generate artifact attestation
        uses: actions/attest-build-provenance@v1
        with:
          subject-name: ${{ env.REGISTRY }}/${{ env.IMAGE_NAME}}
          subject-digest: ${{ steps.push.outputs.digest }}
          push-to-registry: true

Der obige Workflow checkt das GitHub-Repository aus, verwendet login-action für die Anmeldung bei beiden Registrierungen und generiert Tags und Bezeichnungen mit der metadata-action-Aktion. Anschließend erstellt die build-push-action-Aktion das Docker-Image und pusht es an Docker Hub und die Container registry.

Im letzten Schritt generiert es einen Artefaktnachweis für das Bild, wodurch die Lieferkettensicherheit erhöht wird. Weitere Informationen findest du unter Verwenden von Artefaktnachweisen zur Ermittlung der Herkunft von Builds.