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.
Hinweis: 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 Informationen zu GitHub Actions.
Vielleicht findest Du es auch hilfreich, ein grundlegendes Verständnis von Folgendem zu haben:
- Verwenden von Geheimnissen in GitHub-Aktionen
- Automatische Tokenauthentifizierung
- Arbeiten mit der Docker-Registrierung
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.
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 AE 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 created
-Aktivitätstyp ausgelöst wird. Weitere Informationen zum release
-Ereignis findest du unter Ereignisse zum Auslösen von Workflows.
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
undpassword
: 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 FormatDOCKER-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 auftrue
festgelegt ist, wird das Image bei erfolgreicher Erstellung an die Registrierung gepusht.
# 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 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 uses: docker/build-push-action@3b5e8027fcad23fda98b2e3ac259d8d67585f671 with: context: . file: ./Dockerfile push: true tags: ${{ steps.meta.outputs.tags }} labels: ${{ steps.meta.outputs.labels }}
# 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
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
uses: docker/build-push-action@3b5e8027fcad23fda98b2e3ac259d8d67585f671
with:
context: .
file: ./Dockerfile
push: true
tags: ${{ steps.meta.outputs.tags }}
labels: ${{ steps.meta.outputs.labels }}
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.
Images in GitHub Packages veröffentlichen
Jedes Mal, wenn du auf GitHub AE 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 created
-Aktivitätstyp ausgelöst wird. Weitere Informationen zum release
-Ereignis findest du unter Ereignisse zum Auslösen von Workflows.
Im folgenden Beispielworkflow werden die Docker-Aktionen login-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:
registry
: Muss aufdocker.pkg.github.com
festgelegt sein.username
: Du kannst den Kontext${{ github.actor }}
verwenden, um automatisch den Benutzernamen der Benutzer*innen zu verwenden, die die Workflowausführung ausgelöst haben. Weitere Informationen findest du unter Kontexte.password
: Du kannst das automatisch generierteGITHUB_TOKEN
-Geheimnis für das Kennwort verwenden. Weitere Informationen findest du unter Automatische Tokenauthentifizierung.
Für GitHub Packages sind die folgenden build-push-action
-Optionen erforderlich:
-
push
: Wenn diese Option auftrue
festgelegt ist, wird das Image bei erfolgreicher Erstellung an die Registrierung gepusht. -
tags
: Muss im Formatdocker.pkg.github.com/OWNER/REPOSITORY/IMAGE_NAME:VERSION
festgelegt sein.Für ein Image namens
octo-image
, das auf GitHub unterhttp://github.com/octo-org/octo-repo
gespeichert ist, sollte dietags
-Option aufdocker.pkg.github.com/octo-org/octo-repo/octo-image:latest
festgelegt sein. Du kannst wie im Folgenden gezeigt ein einzelnes Tag festlegen oder mehrere Tags in einer Liste angeben.
# 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 GitHub Packages runs-on: ubuntu-latest permissions: packages: write contents: read steps: - name: Check out the repo uses: actions/checkout@v4 - name: Log in to GitHub Docker Registry uses: docker/login-action@f4ef78c080cd8ba55a85445d5b36e214a81df20a with: registry: docker.YOUR-HOSTNAME.com username: ${{ github.actor }} password: ${{ secrets.GITHUB_TOKEN }} - name: Build and push Docker image uses: docker/build-push-action@3b5e8027fcad23fda98b2e3ac259d8d67585f671 with: context: . push: true tags: | docker.YOUR-HOSTNAME.com/${{ github.repository }}/octo-image:${{ github.sha }} docker.YOUR-HOSTNAME.com/${{ github.repository }}/octo-image:${{ github.event.release.tag_name }}
# 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 GitHub Packages
runs-on: ubuntu-latest
permissions:
packages: write
contents: read
steps:
- name: Check out the repo
uses: actions/checkout@v4
- name: Log in to GitHub Docker Registry
uses: docker/login-action@f4ef78c080cd8ba55a85445d5b36e214a81df20a
with:
registry: docker.YOUR-HOSTNAME.com
username: ${{ github.actor }}
password: ${{ secrets.GITHUB_TOKEN }}
- name: Build and push Docker image
uses: docker/build-push-action@3b5e8027fcad23fda98b2e3ac259d8d67585f671
with:
context: .
push: true
tags: |
docker.YOUR-HOSTNAME.com/${{ github.repository }}/octo-image:${{ github.sha }}
docker.YOUR-HOSTNAME.com/${{ github.repository }}/octo-image:${{ github.event.release.tag_name }}
Der obige Workflow checkt das GitHub AE-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 die Docker-Registrierung zu pushen und den Commit-SHA und die Releaseversion als Imagetags anzuwenden.
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.
# 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 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 Docker registry uses: docker/login-action@65b78e6e13532edd9afa3aa52ac7964289d1a9c1 with: registry: docker.YOUR-HOSTNAME.com 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 docker.YOUR-HOSTNAME.com/${{ github.repository }}/my-image - name: Build and push Docker images uses: docker/build-push-action@3b5e8027fcad23fda98b2e3ac259d8d67585f671 with: context: . push: true tags: ${{ steps.meta.outputs.tags }} labels: ${{ steps.meta.outputs.labels }}
# 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
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 Docker registry
uses: docker/login-action@65b78e6e13532edd9afa3aa52ac7964289d1a9c1
with:
registry: docker.YOUR-HOSTNAME.com
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
docker.YOUR-HOSTNAME.com/${{ github.repository }}/my-image
- name: Build and push Docker images
uses: docker/build-push-action@3b5e8027fcad23fda98b2e3ac259d8d67585f671
with:
context: .
push: true
tags: ${{ steps.meta.outputs.tags }}
labels: ${{ steps.meta.outputs.labels }}
Der obige Workflow checkt das GitHub AE-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 Docker-Registrierung.