Skip to main content

GitHub GHCR

· 3 min read

GitHub Container Registry (GHCR) est un service d'hébergement de packages logiciels proposé par GitHub, permettant aux utilisateurs de stocker des packages privés ou publics et de les utiliser comme dépendances dans leurs projets. Compatible avec plusieurs langages de programmation, GitHub Packages propose des registres pour des gestionnaires de packages tels que npm, RubyGems, Maven, Gradle, Docker, et NuGet. L'authentification sur GitHub Packages se fait exclusivement via un "personal access token (classic)". Les utilisateurs doivent disposer de ce token pour effectuer des opérations telles que la publication, l'installation et la suppression de packages, qu'ils soient publics, privés ou internes. Pour les packages privés, GitHub Packages applique des limites de stockage et de transfert de données en fonction du plan du compte. La gestion des packages peut être réalisée à travers l'interface utilisateur GitHub ou via l'API REST. Des webhooks peuvent également être configurés pour suivre des événements liés aux packages, comme la publication ou la mise à jour.

Le workflow suppose que vous avez un Dockerfile à la racine du dépôt. Ce Dockerfile doit réussir la commande de build avec succès

Créez un fichier YAML pour le Workflow

Créez un fichier YAML (par exemple, docker-publish.yml) dans le répertoire .github/workflows/ de votre dépôt avec le contenu suivant :

name: Create and publish a Docker image

on:
push:
branches: ['release']

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

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

permissions:
contents: read
packages: write

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

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

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

Configurez les Options du Workflow

Dans le fichier YAML, vous pouvez personnaliser les options suivantes selon vos besoins :

  • branches: Modifiez la branche déclenchant le workflow.
  • REGISTRY et IMAGE_NAME: Modifiez-les si vous souhaitez utiliser un autre registre ou nom d'image.
  • permissions: Ajustez les autorisations en fonction de vos besoins.

Enregistrez et Poussez vos Modifications Enregistrez les modifications dans le fichier YAML et poussez-les vers la branche "release" de votre dépôt GitHub.

git add .github/workflows/docker-publish.yml
git commit -m "Ajout du workflow de publication Docker"
git push origin release

Utilisation d’un package GHCR

Une fois déployé, le package s’utilise comme n’importe quel docker

docker pull ghcr.io/{USER}/{REPO-NAME}:master

💡 L’utilisation des Github GHCR entraine des consommations d’espace. Le CATIE a le droit à 2Gb de stockage sur GHCR et 10Gb de transit par mois. Au delà de ces limites, nous sommes facturés. L’utilisation (sous n’importe quelle forme) de GHCR sur des dépôts publics est totalement gratuite Sur des dépôts privés : le pull via des actions est gratuit. Pour les actions self-hosted le pull est gratuit si l’action est authentifiée par le GITHUB_TOKEN et non un PAT.

Voici un exemple d’utilisation sans coût associé

name: Run in container from GHCR

on: [ push ]

jobs:
myJob:
runs-on: ubuntu-latest
container:
image: ghcr.io/sedelpeuch/github-ghcr-test:master
steps:

- name: Checkout code
uses: actions/checkout@v2

- name: Run a command
run: echo "Running inside the container"

L’image ghcr.io/sedelpeuch/github-ghcr-test:master est privée, l’accès est possible sans donner de PAT grâce à l’authentification par jeton automatique qui possède la lecture des packages privés https://docs.github.com/fr/actions/security-guides/automatic-token-authentication#permissions-for-the-github_token