Die Geschichte, wie ein Docker-Container mit GitHub-Aktionen in die GitHub-Paketregistrierung und den Docker-Hub verschoben wird

Dieser Artikel ist eine Testversion und hat denselben Inhalt wie [Mein Blog] veröffentlicht (https://blog.fagai.net/2020/09/08/github-actions-package-registry-push/).

Ich werde darüber sprechen, wie ein Docker-Container mit GitHub-Aktionen in die GitHub-Paketregistrierung verschoben wird.

Angenommener Leser

Hintergrund

Jetzt kann ich es als Basisimage für das Unternehmen verwenden

https://github.com/fagai/docker-php

Ich habe die automatische Erstellung für Docker Hub im Github-Repository festgelegt und aus Docker Hub erstellt. Die Build-Zeitleiste für Docker Hub war sehr langsam und ich habe es geschafft, es ein wenig stressig zu halten.

Vor kurzem habe ich mich jedoch für Build + Push mit GitHub-Aktionen entschieden, weil ich etwas gegen das Pull-Limit von Docker Hub und die Tatsache unternehmen wollte, dass GitHub eine öffentliche Beta von Container Registry wurde.

GitHub Container Registry (GCR) und GitHub Package Registry (GPR) unterscheiden sich

Von nun an wird GitHub Container Registry als GCR abgekürzt. Bitte beachten Sie, dass es sich keinesfalls um eine Google Container Registry handelt. (Ich möchte die Abkürzung nicht leiden)

Ersteres wurde neulich als öffentliche Beta veröffentlicht, und letzteres gibt es schon seit einiger Zeit. Der Unterschied zwischen den beiden

Es ist so ein Ort.

In Bezug auf den verknüpften Teil unterscheidet sich der URL-Pfad auch wie folgt.

Es ist anders, ob es an den Benutzer oder das Repository gebunden ist. Nun, der unten beschriebene Inhalt kann in beiden Fällen auf die gleiche Weise geschrieben werden. Ich denke, es ist gut, ihn zu sehen, auch wenn es sich um eine Paketregistrierung handelt.

Ursprünglich habe ich versucht, die GitHub Container Registry zu verwenden, aber ich frage mich, ob die Domain ghcr.io lautet. Dies ... ist es nicht GitHub ...? Ich habe angefangen, die GitHub-Paketregistrierung zu verwenden. Derzeit denke ich, dass GCR besser für die Verwendung geeignet ist, da die Version des Manifests neuer ist. Verwenden Sie GPR, wenn Sie eine Verknüpfung zu einem Paket herstellen möchten.

Als ich es zum ersten Mal tat

Zuerst habe ich Docker Publish des Starter-Workflows verwendet.

https://github.com/actions/starter-workflows/blob/master/ci/docker-publish.yml

Der Typ zu dieser Zeit https://github.com/fagai/docker-php/blob/32988eacf16e697e5376ee0af778079fa1e0fb62/.github/workflows/docker-publish.yml

Im Vergleich zu Docker Hub hatte ich nicht viel Zeit zum Laden in Queue, also war es wirklich gut.

allmählich

Ich habe mich gefragt, ob ich schrittweise auf Docker Hub zugreifen kann, und das Ergebnis https://github.com/docker/build-push-action gefunden. Hier umschreiben.

https://github.com/docker/build-push-action

Zu diesem Zeitpunkt: https://github.com/fagai/docker-php/blob/12d060efd0b91924f0edf85f3b127e19d47cd18a/.github/workflows/docker-publish.yml

- name: Push to GitHub Packages
  uses: docker/build-push-action@v1
  with:
    dockerfile: ${{ matrix.images }}/Dockerfile
    username: ${{ github.actor }}
    password: ${{ secrets.CR_PAT }}
    registry: docker.pkg.github.com
    repository: fagai/docker-php/${{ env.IMAGE_NAME }}
    tags: ${{ env.IMAGE_VERSION }}

Schlank ~~. In Bezug auf CR_PAT ist es eine Abkürzung für Container Registry Personal Access Token. Eigentlich wurde es zum Zeitpunkt des Starter-Workflows geschrieben, also habe ich das Token von github mit diesem Namen gesetzt. (Github.token ist in Ordnung, aber es scheint besser, das Zugriffstoken so weit wie möglich einzugrenzen, sodass ich nur die Zugriffsrepository- und Schreibrepository-Berechtigungen erteilt habe.)

Später habe ich auch die Push-Einstellungen für Docker Hub hinzugefügt.

- name: Push to Docker Hub
  uses: docker/build-push-action@v1
  with:
    dockerfile: ${{ matrix.images }}/Dockerfile
    username: ${{ github.actor }}
    password: ${{ secrets.DOCKER_HUB_TOKEN }}
    repository: fagai/${{ env.IMAGE_NAME }}
    tags: ${{ env.IMAGE_VERSION }}

Im Beispiel von build-push-action wurde ein Kennwort festgelegt, Docker Hub verfügt jedoch auch über ein Zugriffstoken. Verwenden Sie dieses. Ich ziehe es an, nachdem ich es eingestellt habe.

https://docs.docker.com/docker-hub/access-tokens/

Ich möchte verschiedene Dinge wie Bargeld tun

So wie es ist, bezieht es sich nicht auf den Cache. (Die zweite Build-Push-Aktion basiert jedoch auf dem Cache. Wenn Sie also eine erstellen + pushen, können Sie die andere sofort pushen.)

build-push-action hat einen Parameter namens "cache_froms", daher möchte ich ihn gut verwenden.

Nachdem ich verschiedene Dinge ausprobiert hatte, stellte ich fest, dass ich "Buildkit" verwenden muss, um "cache_froms" zu verwenden. Es stellte sich auch heraus, dass Sie "build_args: BUILDKIT_INLINE_CACHE = 1" setzen mussten. Anscheinend hatte cache_froms eine schlechte Atmosphäre, es sei denn, der Domain-Teil wurde ebenfalls angegeben. ← Ich war hier besorgt

So sieht es also aus.

- name: Push to GitHub Packages
  uses: docker/build-push-action@v1
  env:
    DOCKER_BUILDKIT: 1
  with:
    dockerfile: ${{ matrix.images }}/Dockerfile
    username: ${{ github.actor }}
    password: ${{ secrets.CR_PAT }}
    registry: docker.pkg.github.com
    repository: fagai/docker-php/${{ env.IMAGE_NAME }}
    tags: ${{ env.IMAGE_VERSION }}
    build_args: BUILDKIT_INLINE_CACHE=1
    cache_froms: docker.pkg.github.com/fagai/docker-php/${{ env.IMAGE_NAME }}:${{ env.IMAGE_VERSION }}

Sie können damit gehen! ich dachte

Es wird nicht zwischengespeichert ... wenn Sie sich also Aktionen ansehen

#4 importing cache manifest from docker.pkg.github.com/fagai/docker-php/php...
#4 ERROR: httpReaderSeeker: failed open: could not fetch content descriptor sha256:65d9f276544048f140bb1a1cceea52f86e7e704b351c56b8d6b9f18c5e9c0e4d (application/vnd.docker.distribution.manifest.v2+json) from remote: not found

Ich habe einen Fehler wie diesen erhalten und der Build wurde so ausgeführt, wie er war, ohne den Cache zu erhalten. Anscheinend unterstützt die GitHub-Paketregistrierung das neue Manifest von Docker noch nicht. (GitHub Container Registry scheint dies zu unterstützen)

https://github.community/t/handle-multi-arch-docker-images-on-github-package-registry/14314

Also habe ich mich entschlossen, zuerst von Docker Hub zu bauen. cache_froms muss aus docker.io geschrieben werden.

- name: Push to Docker Hub
  uses: docker/build-push-action@v1
  env:
    DOCKER_BUILDKIT: 1
  with:
    dockerfile: ${{ matrix.images }}/Dockerfile
    username: ${{ github.actor }}
    password: ${{ secrets.DOCKER_HUB_TOKEN }}
    repository: fagai/${{ env.IMAGE_NAME }}
    tags: ${{ env.IMAGE_VERSION }}
    build_args: BUILDKIT_INLINE_CACHE=1
    cache_froms: docker.io/fagai/${{ env.IMAGE_NAME }}:${{ env.IMAGE_VERSION }}

So sieht es also aus.

#4 importing cache manifest from docker.io/fagai/php:7.2-alpine-fpm
#4 DONE 0.2s

Die nachfolgende Verarbeitung wird auch als CACHED angezeigt, was darauf hinweist, dass der Build nicht funktioniert und auf dem Cache basiert.

Nachträgliche Nachrüstung

- name: cancel old workflow
  uses: styfle/[email protected]
  with:
    access_token: ${{ github.token }}

Ich habe das in der Vergangenheit getan. Es ist eine Aktion, die die vergangene Aktion abbricht. Es löst das Problem, dass vergangene Aktionen bestehen bleiben und verschoben werden, wenn Sie viele Male festschreiben.

Ich habe auch einen Zeitplan festgelegt, damit Action jeden Montag funktioniert.

on:
  push:
    branches:
      - master
  pull_request:
  #Führen Sie regelmäßige Updates durch(jeden Montag)
  schedule:
    - cron:  '0 0 * * 1'

Schließlich

Durch das Erstellen und Pushen von GitHub-Aktionen wurde das Problem gelöst, auf das Docker Hub lange in der Warteschlange gewartet hat. Vor allem kann es parallel erstellt werden, sodass es in kurzer Zeit gepusht werden kann.

build-push-action ist v2 und buildx Es scheint, dass der neu hinzugefügte Build in Docker 19.03 verwendet wird. BuildKit scheint halboffiziell zu sein, und Buildx scheint eine offizielle Build-kompatible Funktion mit mehreren CPUs zu sein. Auf einem Mac wird durch Eingabe von "Docker Buildx Install" ein Alias für "Docker Build" eingefügt und Buildx wird ohne Erlaubnis verwendet. Wie schön.

Recommended Posts

Die Geschichte, wie ein Docker-Container mit GitHub-Aktionen in die GitHub-Paketregistrierung und den Docker-Hub verschoben wird
Erste Schritte mit der Git Hub Container Registry anstelle von Docker Hub
Minimaler Workflow zum Verschieben des Docker-Images in die Github-Container-Registrierung mit Github-Aktionen
Testen, erstellen und verschieben Sie Docker-Images mithilfe von GitHub-Aktionen in die GitHub-Container-Registrierung
Übertragen Sie ein Docker-Image von GitHub Actions in die GitHub Container Registry
[Docker] So sehen Sie den Inhalt von Volumes. Starten Sie einen Container mit Root-Rechten.
So erstellen Sie einen Jenkins-Server mit einem Docker-Container unter CentOS 7 von VirtualBox und greifen von einem lokalen PC auf den Jenkins-Server zu
Docker Push zur GitHub Container Registry (ghcr.io)
Die Geschichte der Aktualisierung des Docker-Containers von Sonar Qube
Übertragen Sie das von Docker Hub verteilte Docker-Image in die Google Container-Registrierung und starten Sie die VM basierend auf diesem Image
Bis zum Start eines Docker-Containers, der mit RedHat Quarkus erstellt wurde
Schritte zum Verschieben eines Docker-Images in die GitHub Container Registry (ghcr.io)
Die Geschichte, einen Reverse-Proxy mit ProxyServlet zu erstellen
[Docker] Wie man mit einem Container in Heroku aktualisiert und wie man mit Migrate Error umgeht
Erstellen Sie ein Container-Image für Kibanas arm64 und registrieren Sie es in der GitHub-Container-Registrierung. Starten Sie Elastic Stack mit Docker Compose auf Raspberry Pi 4 (64 Bit).
Eine Geschichte voller Grundlagen von Spring Boot (gelöst)
Eine Geschichte, die von String () von Interface abhängig ist und von JdkDynamicAopProxy vertreten wird
Die Geschichte des Erstellens einer Java-Version des Minecraft-Servers mit GCP (und dem Festlegen einer weißen Liste)
[Docker] Löschen Sie nur das Volume, das einem bestimmten Container zugeordnet ist
Die Geschichte, Java mithilfe der BitBucket-Pipeline nach Heroku zu bringen
Erstellen Sie mit Raspberry Pi und Docker Compose im Handumdrehen ein NAS mit DLNA-Funktion
Ich habe versucht, die Ergebnisse vor und nach der Date-Klasse mit einer geraden Zahl auszudrücken
Erstellen wir einen Docker-Container, der SSH auf die Mindestkonfiguration von CentOS 8 ausführen kann
Eine Geschichte über die Bekämpfung der Ubuntu-Fehler 0x80370114 und 0x80000000, um den Docker-Desktop mit wsl2 in Windows 10 Home zu aktivieren
Die Geschichte des Refactorings mit einem selbstgemachten Helfer zum ersten Mal in einer Rails-App
Versuchen Sie, die Idee eines zweidimensionalen Arrays mit einem eindimensionalen Array nachzuahmen
Auf Anforderung wird der Zugriff auf die Ressource beim Push mit Docker verweigert
Ich habe versucht, mit Docker eine Plant UML Server-Umgebung zu erstellen
Eine Geschichte über die Verbindung zu einem CentOS 8-Server mit einem alten Ansible
Die Geschichte von toString () beginnt mit der Übergabe eines Arrays an System.out.println
Eine Geschichte über das Erreichen der League Of Legends-API mit JAVA
Eine Geschichte, die mit der Einführung von Web Apple Pay zu kämpfen hatte
[GCP] Bis Sie das lokale Docker-Image in die Container-Registrierung verschieben
Eine Geschichte, der ich mit der automatischen Starteinstellung von Tomcat 8 unter CentOS 8 zweimal verfallen war
Eine Geschichte, die ich mit der Stream-API von Java8 einem Prozess schreiben wollte, der einer while-Anweisung entspricht
Wie man IGV mit Socket-Kommunikation bedient und wie man einen Ruby Gem mit dieser Methode herstellt
Herunterladen und Ausführen des Jar-Pakets direkt aus dem Maven-Repository mit nur der Befehlszeile
Warten Sie, bis PostgreSQL mit Docker gestartet ist, und starten Sie dann den WEB-Dienst
Die Geschichte eines Game Launcher mit automatischer Ladefunktion [Java]
Beginnen Sie mit der Installation von Docker auf EC2 und dem Ausführen von Yellowfin in einem Container
Ich habe versucht, die Geschwindigkeit von Graal VM mit JMH zu messen und zu vergleichen
So starten Sie einen Docker-Container mit einem in einer Batchdatei bereitgestellten Volume
Immerhin wollte ich den Inhalt von MySQL mit Docker in der Vorschau anzeigen ...
Veröffentlichen Sie das Docker-Image in der GitHub-Paketregistrierung
Migrieren Sie Dockerhub-Images in die Github Container Registry
Einführung von Docker Hub und Befehlen Selbstlernend ①
So mounten Sie den Speicherort der Batchdatei über WSL2 und starten den Docker-Container
So erhalten Sie die ID eines Benutzers, der sich in Swift bei Firebase authentifiziert hat
Anzeigen der vom Docker-Container verwendeten Festplattenmenge für jeden Container
Überwachen Sie den Docker-Container und den SystemD-Prozess auf demselben Host mit Zabbix unter Ubuntu.
Führen Sie Docker in die Entwicklungs- und Testumgebung vorhandener Rails- und MySQL-Apps ein
Der Name ist und das Alter ist Senden Sie eine Benachrichtigung an Slack mit der Java-freien Version von Sentry (mit Lambda)