Skip to main content

So veröffentlichen Sie Node.js-Docker-Images mit GitHub Actions in der Docker Hub Registry

Artikel von

9. August 2021

0 Min. Lesezeit

In einem früheren Beitrag haben wir eine Schritt-für-Schritt-Anleitung dazu vorgestellt, wie Sie Node.js-Docker-Images mit GitHub Actions in der GitHub Packages Registry veröffentlichen. In diesem Beitrag konzentrieren wir uns darauf, das von uns erstellte Docker-Image in der öffentlichen Docker Hub Registry zu veröffentlichen.

Warum ist das nützlich, fragen Sie sich vielleicht? Die Docker-Befehlszeilenanwendung docker verwendet standardmäßig die Registry docker.io, die auf die Docker Hub Registry verweist. Das ermöglicht eine komfortable Entwicklererfahrung: Images lassen sich nach dem Schema <user>/<repository> abrufen, zum Beispiel, wenn Sie die Snyk CLI als Docker-Image verwenden möchten:

docker pull snyk/snyk-cli

In diesem Artikel führen wir Sie Schritt für Schritt durch die Konfiguration eines weiteren Workflows zum Erstellen und Veröffentlichen von Docker-Images. Dieser kann parallel zu dem zuvor vorgestellten Workflow für die GitHub Packages Registry ausgeführt werden.

Wie der vorherige Beitrag knüpft auch dieser an Dockly an, das Open-Source-Befehlszeilentool auf Node.js-Basis zur Verwaltung von Docker-Containern über die CLI, und zeigt, wie Sie ein Docker-Image zu Docker Hub pushen. Den fertigen Workflow finden Sie im GitHub-Repository von Dockly.

GitHub-Actions-Workflow erstellen

Um einen neuen Workflow hinzuzufügen, erstellen Sie einfach eine neue Datei im Verzeichnis .github/workflows/. Alternativ können Sie Ihr Open-Source-Repository auf GitHub öffnen, auf den Tab Actions und anschließend auf New Workflow klicken und einen neuen Workflow erstellen:

GitHub-Actions-Seite mit der Workflow-Liste, in der „Docker: GitHub Packages“ und ein Filter „All workflows“ angezeigt werden.

Wählen Sie einen Dateinamen für die Workflow-Datei zum Veröffentlichen in Docker Hub, zum Beispiel docker-publish-to-dockerhub.yml.

Wenn Sie dafür die GitHub-Benutzeroberfläche verwenden, ist die Workflow-Datei möglicherweise bereits vorausgefüllt. Löschen Sie in diesem Fall einfach den Inhalt und fügen Sie Folgendes ein:

name: "Docker: Docker Hub"

# This workflow uses actions that are not certified by GitHub.
# They are provided by a third-party and are governed by
# separate terms of service, privacy policy, and support
# documentation.

on:
  push:
    branches: [ main ]
    tags: [ 'v*.*.*' ]
  pull_request:
    branches: [ main ]

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

Wir haben alle Punkte ausführlich im vorherigen Artikel beschrieben. Hier eine kurze Zusammenfassung:

  • Dieser Docker-Hub-Workflow wird bei jedem Push, jedem Tag-Release und jedem Pull Request für den main-Branch des Repositorys ausgeführt.

  • Die globalen Umgebungsvariablen legen REGISTRY auf docker.io fest. Das bedeutet, dass unsere Images zu Docker Hub gepusht und dort verfügbar sein werden. Mit IMAGE_NAME werden der GitHub-Benutzername und der Repository-Name festgelegt. Wenn Sie einen anderen Docker-Hub-Benutzernamen haben, müssen Sie diesen Wert möglicherweise anpassen.

Als Nächstes definieren wir unsere Jobs, in denen wir den Prozess zum Erstellen und anschließenden Veröffentlichen des Docker-Images festlegen.

Bei Docker Hub anmelden und das Docker-Image erstellen und veröffentlichen

Als Nächstes müssen wir folgende Schritte ausführen:

  1. Bei Docker Hub anmelden. Dazu müssen wir in Docker Hub ein Token erstellen und es in den GitHub-Repository-Einstellungen als Repository-Secret hinterlegen.

  2. Metadaten des erstellten Docker-Images extrahieren, damit sie für den Build-Prozess des Images verfügbar sind.

  3. Das erstellte Docker-Image zu Docker Hub pushen.

Das erreichen wir mit dem folgenden Codeausschnitt, den Sie dem Workflow-Inhalt hinzufügen müssen, den wir im vorherigen Schritt erstellt haben:

jobs:
  build_and_publish:

    runs-on: ubuntu-latest
    permissions:
      contents: read
      packages: write

    steps:
      - name: Checkout repository
        uses: actions/checkout@v2

      - name: Log into registry ${{ env.REGISTRY }}
        if: github.event_name != 'pull_request'
        uses: docker/login-action@28218f9b04b4f3f62068d7b6ce6ca5b26e35336c
        with:
          registry: ${{ env.REGISTRY }}
          username: ${{ secrets.DOCKERHUB_USERNAME }}
          password: ${{ secrets.DOCKERHUB_TOKEN }}

      - name: Extract Docker metadata
        id: meta
        uses: docker/metadata-action@98669ae865ea3cffbcbaa878cf57c20bbf1c6c38
        with:
          images: ${{ env.REGISTRY }}/${{ env.IMAGE_NAME }}
          flavor: |
            latest=true
            prefix=
            suffix=

      - name: Build and push Docker image
        uses: docker/build-push-action@ad44023a93711e3deb337508980b4b5e9bcdc5dc
        with:
          context: .
          push: ${{ github.event_name != 'pull_request' }}
          tags: ${{ steps.meta.outputs.tags }}
          labels: ${{ steps.meta.outputs.labels }}

Nachdem Sie die Workflow-Datei angewendet und in den main-Branch gemergt haben, sollte der Build erfolgreich durchlaufen und ein neues Docker-Image in die Docker Hub Registry pushen:

GitHub-Actions-Benachrichtigung zu einem neuen Job, der im Main-Branch auf Docker Hub veröffentlicht werden soll

Ein bekannter Haken: Das Docker-Hub-Repository, in das Sie das Image veröffentlichen, erhält derzeit nicht automatisch eine passende Beschreibung und README-Inhalte. Diese Funktion ist in der offiziellen GitHub Action docker/build-and-push nicht verfügbar.

Wenn Sie diese Funktion nutzen möchten, empfehlen die Maintainer die GitHub Action Docker Hub Description aus dem Marketplace. In der Dokumentation finden Sie ein Beispiel, das Sie übernehmen können.

Docker-Images aus der Docker Hub Registry abrufen

Um das neue Docker-Image aus Docker Hub abzurufen, führen Sie einfach den bekannten Befehl docker pull aus, zum Beispiel:

$ docker pull <user>/<repository>
Using default tag: latest
latest: Pulling from <user>/<repository>
b4d181a07f80: Pulling fs layer
de8ecf497b75: Pulling fs layer
69b92f9e5e70: Pulling fs layer
1f2b8e2c8ad8: Waiting
d0f4259cb643: Waiting
9ae47f3f99ba: Waiting
87270829eb60: Waiting
905fc634546c: Waiting

Pushen Sie anfällige Docker-Images?

Warum hier aufhören? Mit Snyk können Sie Schwachstellen in Docker-Images finden, überwachen und sogar beheben. Nutzen Sie den Workflow, der am besten zu Ihnen passt: Verwenden Sie entweder die CLI oder importieren Sie Docker-Images direkt aus Docker Hub, um sie auf Sicherheitslücken zu überwachen.

Mein Kollege Eric Smalling hat einen ausführlichen Leitfaden zu Best Practices für entwicklergesteuerte Workflows – Dockerfile- und Image-Scanning, Priorisierung und Behebung verfasst, falls Sie Ihr Wissen vertiefen möchten. Außerdem gibt es eine Snyk GitHub Action, mit der Sie im GitHub-Actions-Ökosystem Open-Source-Bibliotheken und Container-Images auf Sicherheitslücken überprüfen können.

Noch tiefer einsteigen

Wenn Sie sich weiter mit Best Practices für die Erstellung von Docker-Images beschäftigen möchten, empfehle ich Ihnen Folgendes:

  1. 10 Best Practices, um Node.js-Webanwendungen mit Docker zu containerisieren

  2. Docker für Node.js-Entwickler: 5 Dinge, die Sie wissen müssen, um Ihre Sicherheit nicht zu gefährden

Falls Sie den vorherigen Artikel noch nicht gelesen haben und Docker-Images in GitHub Packages veröffentlichen möchten, erfahren Sie hier, wie Sie Node.js-Docker-Images mit GitHub Actions in der GitHub Packages-Registry veröffentlichen.

Container-Sicherheit mit Fokus auf Entwickler

Snyk findet und behebt automatisch Schwachstellen in Container-Images und Kubernetes-Workloads.