L'histoire du transfert d'un conteneur Docker vers le registre de packages GitHub et Docker Hub avec des actions GitHub

Cet article est un essai et a publié le même contenu que Mon blog.

Je vais parler de pousser un conteneur Docker vers le registre de packages GitHub avec des actions GitHub.

Lecteur supposé

Contexte

Je peux maintenant l'utiliser comme image de base pour l'entreprise

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

J'ai défini la construction automatisée pour Docker Hub dans le référentiel github et construite à partir de Docker Hub. Le calendrier de construction de Docker Hub était très lent et j'ai réussi à le garder un peu stressant.

Cependant, récemment, j'ai décidé de Build + Push avec GitHub Actions parce que je voulais faire quelque chose sur la limite de tirage de Docker Hub et le fait que GitHub est devenu une version bêta publique de Container Registry.

GitHub Container Registry (GCR) et GitHub Package Registry (GPR) sont différents

À partir de là, GitHub Container Registry est abrégé en GCR, veuillez noter qu'il ne s'agit en aucun cas d'un Google Container Registry. (Je ne veux pas subir l'abréviation)

Le premier a été publié en version bêta publique l'autre jour, et le second existe depuis un certain temps. La différence entre les deux

C'est un endroit comme ça.

En ce qui concerne la partie liée, le chemin de l'URL est également différent comme suit.

Il est différent qu'il soit lié à l'utilisateur ou au référentiel comme celui-ci. Eh bien, le contenu écrit ci-dessous peut être écrit de la même manière, donc je pense qu'il est bon de le voir même s'il s'agit d'un registre de packages.

À l'origine, j'essayais d'utiliser GitHub Container Registry, mais je me demande si le domaine est ghcr.io Ce ... n'est pas GitHub ...? J'ai commencé à utiliser le registre de packages GitHub. À l'heure actuelle, je pense que GCR est meilleur à utiliser car la version du manifeste est plus récente. Utilisez GPR lorsque vous souhaitez créer un lien vers un package.

Quand je l'ai fait pour la première fois

Au début, j'ai utilisé la publication docker du flux de travail de démarrage.

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

Le gars à ce moment-là https://github.com/fagai/docker-php/blob/32988eacf16e697e5376ee0af778079fa1e0fb62/.github/workflows/docker-publish.yml

Comparé à Docker Hub, je n'ai pas eu beaucoup de temps pour charger dans Queue, donc c'était vraiment bien.

progressivement

Je me demandais si je pouvais pousser progressivement vers Docker Hub, et j'ai trouvé le résultat https://github.com/docker/build-push-action. A réécrire ici.

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

À ce moment-là: 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 }}

Slim ~~. En ce qui concerne CR_PAT, c'est une abréviation pour Container Registry Personal Access Token. En fait, il a été écrit au niveau du workflow de démarrage, j'ai donc défini le jeton de github avec ce nom. (Github.token va bien, mais il semble préférable de restreindre le plus possible le jeton d'accès, donc je n'ai donné que le référentiel d'accès et les autorisations d'écriture du référentiel)

Plus tard, j'ai également ajouté les paramètres push pour Docker Hub.

- 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 }}

Dans l'exemple de build-push-action, le mot de passe a été défini, mais Docker Hub a également un jeton d'accès, alors utilisez-le. Je l'ai mis après l'avoir réglé.

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

Je veux faire diverses choses comme de l'argent

En l'état, il ne fait pas référence au cache. (Cependant, la deuxième action build-push est basée sur le cache, donc si vous construisez + push one, vous pouvez pousser l'autre immédiatement)

build-push-action a un paramètre appelé cache_froms, donc je veux bien l'utiliser.

Après avoir essayé diverses choses, j'ai trouvé que je devais utiliser Buildkit pour utiliser cache_froms. Il s'est également avéré que vous deviez définir build_args: BUILDKIT_INLINE_CACHE = 1. Apparemment, cache_froms avait une mauvaise ambiance à moins que la partie domaine ne soit également spécifiée. ← J'étais inquiet ici

Donc ça ressemble à ça.

- 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 }}

Vous pouvez y aller! j'ai pensé

Ce n'est pas mis en cache ... donc si vous regardez Actions

#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

J'ai eu une erreur comme celle-ci et la construction s'est déroulée telle quelle sans obtenir le cache. Apparemment, le registre de packages GitHub ne prend pas encore en charge le nouveau manifeste de docker. (GitHub Container Registry semble le prendre en charge)

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

J'ai donc décidé de construire d'abord à partir de Docker Hub. cache_froms doit être écrit à partir de docker.io.

- 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 }}

Donc ça ressemble à ça.

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

Le traitement suivant sera également affiché comme CACHED, indiquant que la construction ne fonctionne pas et est basée sur le cache.

Rénovation ultérieure

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

J'ai fait ça dans le passé. C'est une action qui annule l'action passée. Cela résout le problème que les actions passées restent et bougent lorsque vous vous engagez plusieurs fois.

J'ai également établi un calendrier pour qu'Action fonctionne tous les lundis.

on:
  push:
    branches:
      - master
  pull_request:
  #Faites des mises à jour régulières(tous les lundis)
  schedule:
    - cron:  '0 0 * * 1'

finalement

À la suite de la création et du transfert d'actions GitHub, le problème que Docker Hub attend depuis longtemps dans la file d'attente a été résolu, et surtout, il peut être construit en parallèle, de sorte qu'il peut être poussé en peu de temps.

build-push-action est v2 et buildx Il semble que la nouvelle version ajoutée dans Docker 19.03 sera utilisée. BuildKit semble être semi-officiel, et Buildx semble être une fonction officielle compatible avec la construction multi-CPU. Sur mac, en tapant docker buildx install, un alias pour docker build sera collé et buildx sera utilisé sans autorisation. Comme c'est gentil.

Recommended Posts

L'histoire du transfert d'un conteneur Docker vers le registre de packages GitHub et Docker Hub avec des actions GitHub
Premiers pas avec Git Hub Container Registry au lieu de Docker Hub
Flux de travail minimal pour pousser l'image Docker vers Github Container Registry avec des actions Github
Tester, créer et pousser des images Docker vers GitHub Container Registry à l'aide d'actions GitHub
Transférer une image Docker des actions GitHub vers GitHub Container Registry
[Docker] Comment voir le contenu des volumes. Démarrez un conteneur avec les privilèges root.
Comment créer un serveur Jenkins avec un conteneur Docker sur CentOS 7 de VirtualBox et accéder au serveur Jenkins à partir d'un PC local
Docker push vers GitHub Container Registry (ghcr.io)
L'histoire de la mise à jour du Docker Container de Sonar Qube
Poussez l'image Docker distribuée par Docker Hub vers Google Container Registry et démarrez la VM en fonction de cette image
Jusqu'au lancement d'un conteneur Docker construit avec RedHat Quarkus
Étapes pour pousser une image Docker vers GitHub Container Registry (ghcr.io)
L'histoire de la création d'un proxy inverse avec ProxyServlet
[Docker] Comment mettre à jour à l'aide d'un conteneur dans Heroku et comment gérer l'erreur de migration
Créez une image de conteneur pour l'arm64 de Kibana et enregistrez-la dans le registre de conteneurs GitHub. Démarrez Elastic Stack avec Docker Compose sur Raspberry Pi 4 (64 bits)
Une histoire remplie des bases de Spring Boot (résolu)
Une histoire à laquelle j'étais accro avec toString () d'Interface qui était proxy avec JdkDynamicAopProxy
L'histoire de la création d'une version Java du serveur Minecraft avec GCP (et également de la création d'une liste blanche)
[Docker] Supprimer uniquement le volume associé à un conteneur spécifique
L'histoire de la transmission de Java à Heroku à l'aide du pipeline BitBucket
Construisez un NAS avec la fonction DLNA à la vitesse d'une seconde avec Raspberry Pi et Docker Compose
J'ai essayé d'exprimer les résultats avant et après de la classe Date avec une ligne droite numérique
Créons un conteneur Docker qui peut SSH à la configuration minimale de CentOS 8
Une histoire sur la lutte contre les erreurs Ubuntu 0x80370114 et 0x80000000 pour activer Docker Desktop avec WSL2 dans Windows10 Home
L'histoire du refactoring avec un assistant personnel pour la première fois dans une application Rails
Essayez d'imiter l'idée d'un tableau à deux dimensions avec un tableau à une dimension
Lorsque l'accès demandé à la ressource est refusé lors de la transmission avec Docker
J'ai essayé de créer un environnement de serveur UML Plant avec Docker
Une histoire sur la connexion à un serveur CentOS 8 avec un ancien Ansible
L'histoire de toString () commençant par le passage d'un tableau à System.out.println
Une histoire sur l'utilisation de l'API League Of Legends avec JAVA
Une histoire qui a eu du mal avec l'introduction de Web Apple Pay
[GCP] Jusqu'à ce que vous transmettiez l'image Docker locale à Container Registry
Une histoire à laquelle j'étais accro à deux reprises avec le paramètre de démarrage automatique de Tomcat 8 sur CentOS 8
Je voulais écrire un processus équivalent à une instruction while avec l'API Java 8 Stream
Comment faire fonctionner IGV en utilisant la communication par socket, et l'histoire de la création d'un Ruby Gem en utilisant cette méthode
Comment télécharger et exécuter le package Jar directement à partir du référentiel Maven avec juste la ligne de commande
Attendez que PostgreSQL démarre avec Docker, puis démarrez le service WEB
L'histoire de la création d'un lanceur de jeu avec une fonction de chargement automatique [Java]
Commencer par installer Docker sur EC2 et exécuter Yellowfin dans un conteneur
J'ai essayé de mesurer et de comparer la vitesse de Graal VM avec JMH
Comment démarrer un conteneur Docker avec un volume monté dans un fichier de commandes
Après tout, je voulais prévisualiser le contenu de mysql avec Docker ...
Publier l'image Docker dans le registre de packages GitHub
Migrer les images Dockerhub vers Github Container Registry
Introduction de Docker Hub et des commandes Auto-apprentissage ①
Comment monter l'emplacement du fichier de commandes via WSL2 et démarrer le conteneur Docker
Comment obtenir l'ID d'un utilisateur qui s'est authentifié avec Firebase dans Swift
Comment afficher la quantité de disque utilisée par le conteneur Docker pour chaque conteneur
Surveillez le conteneur Docker et le processus SystemD sur le même hôte avec Zabbix sur Ubuntu.
Présentez Docker à l'environnement de développement et à l'environnement de test des applications Rails et MySQL existantes
Envoyez des notifications à Slack avec la version gratuite de sentry (en utilisant lambda)