{"meta":{"title":"Publication des images Docker","intro":"Dans ce tutoriel, vous allez apprendre à publier des images Docker dans un registre, comme Docker Hub ou GitHub Packages, dans le cadre de votre flux de travail d'intégration continue (CI).","product":"GitHub Actions","breadcrumbs":[{"href":"/fr/actions","title":"GitHub Actions"},{"href":"/fr/actions/tutorials","title":"Tutoriels"},{"href":"/fr/actions/tutorials/publish-packages","title":"Publier des packages"},{"href":"/fr/actions/tutorials/publish-packages/publish-docker-images","title":"Publier des images Docker"}],"documentType":"article"},"body":"# Publication des images Docker\n\nDans ce tutoriel, vous allez apprendre à publier des images Docker dans un registre, comme Docker Hub ou GitHub Packages, dans le cadre de votre flux de travail d'intégration continue (CI).\n\n## Présentation\n\nCe guide vous montre comment créer un flux de travail qui effectue une build Docker, puis publier des images Docker sur Docker Hub ou GitHub Packages. Avec un seul workflow, vous pouvez publier des images sur un registre unique ou sur plusieurs registres.\n\n> \\[!NOTE]\n> Si vous souhaitez envoyer (push) à un autre registre Docker tiers, l’exemple des [images de publication dans GitHub Packages](#publishing-images-to-github-packages) la section peut servir de modèle approprié.\n\n## Prérequis\n\nIl est recommandé d’avoir une compréhension de base des options de configuration de workflows et de la création de fichiers de workflow. Pour plus d’informations, consultez « [Écriture de workflows](/fr/actions/learn-github-actions) ».\n\nVous pouvez également trouver utile d’avoir une compréhension de base des éléments suivants :\n\n* [Utilisation de secrets dans GitHub Actions](/fr/actions/security-guides/using-secrets-in-github-actions)\n* [Utiliser GITHUB\\_TOKEN pour l’authentification dans les flux de travail](/fr/actions/security-guides/automatic-token-authentication)\n* [Utilisation du registre de conteneurs](/fr/packages/working-with-a-github-packages-registry/working-with-the-container-registry)\n\n## À propos de la configuration d’une image\n\nCe guide suppose que vous disposez d’une définition complète pour une image Docker stockée dans un GitHub référentiel. Par exemple, votre dépôt doit contenir un *Dockerfile* et tous les autres fichiers nécessaires pour exécuter une build Docker pour créer une image.\n\n```\n          Vous pouvez utiliser des clés d’annotation prédéfinies pour ajouter des métadonnées, notamment une description, une licence et un dépôt source, à votre image conteneur. Pour plus d’informations, consultez [AUTOTITLE](/packages/working-with-a-github-packages-registry/working-with-the-container-registry#labelling-container-images).\n```\n\nDans ce guide, nous allons utiliser l’action Docker `build-push-action` pour générer l’image Docker et la pousser vers un ou plusieurs registres Docker. Pour plus d’informations, consultez [`build-push-action`](https://github.com/marketplace/actions/build-and-push-docker-images).\n\n## Publication d’images dans Docker Hub\n\n> \\[!NOTE]\n> Docker Hub impose normalement des limites de débit sur les opérations d’envoi (push) et de tirage (pull), ce qui affectera les tâches sur les exécuteurs auto-hébergés. Toutefois, les exécuteurs hébergés par GitHub ne sont pas soumis à ces limites, conformément à un accord entre GitHub et Docker.\n\nChaque fois que vous créez une nouvelle version sur GitHub, vous pouvez déclencher un flux de travail pour publier votre image. Le workflow dans l’exemple ci-dessous s’exécute quand l’événement `release` se déclenche avec le type d’activité `published`.\n\nDans l’exemple de flux de travail ci-dessous, nous utilisons les actions Docker `login-action` et `build-push-action` pour générer l’image Docker et, si la génération réussit, envoyez l’image générée à Docker Hub.\n\nPour envoyer (push) vers Docker Hub, vous devez disposer d’un compte Docker Hub et d’un dépôt Docker Hub créé. Pour plus d’informations, consultez [Pushing a Docker container image to Docker Hub](https://docs.docker.com/docker-hub/quickstart/#step-3-build-and-push-an-image-to-docker-hub) dans la documentation Docker.\n\nLes options `login-action` requises pour Docker Hub sont les suivantes :\n\n* `username` et `password` : il s’agit de votre nom d’utilisateur et mot de passe Docker Hub. Nous vous recommandons de stocker votre Docker Hub nom d'utilisateur et mot de passe en tant que secrets afin qu'ils ne soient pas exposés dans votre fichier de flux de travail. Pour plus d’informations, consultez « [Utilisation de secrets dans GitHub Actions](/fr/actions/security-guides/using-secrets-in-github-actions) ».\n\nL’option `metadata-action` requise pour Docker Hub est la suivante :\n\n* `images` : espace de noms et nom de l’image Docker que vous générez/envoyez à Docker Hub.\n\nLes options `build-push-action` requises pour Docker Hub sont les suivantes :\n\n* `tags` : étiquette de votre nouvelle image au format `DOCKER-HUB-NAMESPACE/DOCKER-HUB-REPOSITORY:VERSION`. Vous pouvez définir une étiquette unique comme indiqué ci-dessous ou spécifier plusieurs étiquettes dans une liste.\n* `push` : si la valeur est `true`, l’image est envoyée au registre si elle est générée avec succès.\n\n```yaml copy\n# Ce workflow utilise des actions qui ne sont pas certifiées par GitHub.\n# Elles sont fournies par un tiers et régies par\n# des conditions d’utilisation du service, une politique de confidentialité et un support distincts.\n# documentation en ligne.\n\n# GitHub recommande d’épingler les actions à un SHA de commit.\n# Pour obtenir une version plus récente, vous devez mettre à jour le SHA.\n# Vous pouvez également référencer une balise ou une branche, mais l’action peut changer sans avertissement.\n\nname: Publish Docker image\n\non:\n  release:\n    types: [published]\n\njobs:\n  push_to_registry:\n    name: Push Docker image to Docker Hub\n    runs-on: ubuntu-latest\n    permissions:\n      packages: write\n      contents: read\n      attestations: write\n      id-token: write\n    steps:\n      - name: Check out the repo\n        uses: actions/checkout@v6\n\n      - name: Log in to Docker Hub\n        uses: docker/login-action@f4ef78c080cd8ba55a85445d5b36e214a81df20a\n        with:\n          username: ${{ secrets.DOCKER_USERNAME }}\n          password: ${{ secrets.DOCKER_PASSWORD }}\n\n      - name: Extract metadata (tags, labels) for Docker\n        id: meta\n        uses: docker/metadata-action@9ec57ed1fcdbf14dcef7dfbe97b2010124a938b7\n        with:\n          images: my-docker-hub-namespace/my-docker-hub-repository\n\n      - name: Build and push Docker image\n        id: push\n        uses: docker/build-push-action@3b5e8027fcad23fda98b2e3ac259d8d67585f671\n        with:\n          context: .\n          file: ./Dockerfile\n          push: true\n          tags: ${{ steps.meta.outputs.tags }}\n          labels: ${{ steps.meta.outputs.labels }}\n\n      - name: Generate artifact attestation\n        uses: actions/attest@v4\n        with:\n          subject-name: index.docker.io/my-docker-hub-namespace/my-docker-hub-repository\n          subject-digest: ${{ steps.push.outputs.digest }}\n          push-to-registry: true\n```\n\nLe flux de travail ci-dessus extrait le référentiel GitHub, utilise le `login-action` pour vous connecter au Registre, puis utilise l'action `build-push-action` pour générer une image Docker basée sur le `Dockerfile` de votre référentiel ; Envoyez l’image à Docker Hub et appliquez une balise à l’image.\n\nAu cours de la dernière étape, il génère une attestation d’artefact pour l’image, ce qui augmente la sécurité de la chaîne d’approvisionnement. Pour plus d’informations, consultez « [Utilisation des attestations d’artefacts pour établir la provenance des builds](/fr/actions/security-guides/using-artifact-attestations-to-establish-provenance-for-builds) ».\n\n## Publication d’images dans GitHub Packages\n\nChaque fois que vous créez une nouvelle version sur GitHub, vous pouvez déclencher un flux de travail pour publier votre image. Le workflow dans l’exemple ci-dessous s’exécute lorsqu’une modification est poussée vers la branche `release`.\n\nDans l’exemple de flux de travail ci-dessous, nous utilisons docker `login-action`, `metadata-action` et `build-push-action` les actions pour générer l’image Docker, et si la génération réussit, envoyons l’image générée vers GitHub Packages.\n\nLes options `login-action` requises pour GitHub Packages sont les suivantes :\n\n* `registry`: doit être défini sur `ghcr.io`.\n* `username`: vous pouvez utiliser le `${{ github.actor }}` contexte pour utiliser automatiquement le nom d’utilisateur de l’utilisateur qui a déclenché l’exécution du flux de travail. Pour plus d’informations, consultez « [Référence des contextes](/fr/actions/learn-github-actions/contexts#github-context) ».\n* `password` : vous pouvez utiliser le secret `GITHUB_TOKEN` généré automatiquement pour le mot de passe. Pour plus d’informations, consultez « [Utiliser GITHUB\\_TOKEN pour l’authentification dans les flux de travail](/fr/actions/security-guides/automatic-token-authentication) ».\n\nL’option `metadata-action` requise pour GitHub Packages est la suivante :\n\n* `images` : espace de noms et nom de l’image Docker que vous générez.\n\nLes `build-push-action` options requises pour GitHub Packages sont :\n\n* `context`: définit le contexte de la build comme jeu de fichiers situé dans le chemin d’accès spécifié.\n* `push`: Si elle est définie sur `true`, l’image est poussée au registre si elle est générée avec succès.\n* `tags` et `labels`: Celles-ci sont remplies par la sortie de `metadata-action`.\n\n> \\[!NOTE]\n>\n> * Ce workflow utilise des actions qui ne sont pas certifiées par GitHub. Elles sont fournies par un tiers et sont régies par des conditions d’utilisation du service, une politique de confidentialité et une documentation de support distinctes.\n> * GitHub recommande d’épingler les actions à un SHA de commit. Pour obtenir une version plus récente, vous devez mettre à jour le SHA. Vous pouvez également référencer une balise ou une branche, mais l’action peut changer sans avertissement.\n\n```yaml annotate copy\n#\nname: Create and publish a Docker image\n\n# Configures this workflow to run every time a change is pushed to the branch called `release`.\non:\n  push:\n    branches: ['release']\n\n# Defines two custom environment variables for the workflow. These are used for the Container registry domain, and a name for the Docker image that this workflow builds.\nenv:\n  REGISTRY: ghcr.io\n  IMAGE_NAME: ${{ github.repository }}\n\n# There is a single job in this workflow. It's configured to run on the latest available version of Ubuntu.\njobs:\n  build-and-push-image:\n    runs-on: ubuntu-latest\n    # Sets the permissions granted to the `GITHUB_TOKEN` for the actions in this job.\n    permissions:\n      contents: read\n      packages: write\n      attestations: write\n      id-token: write\n      #\n    steps:\n      - name: Checkout repository\n        uses: actions/checkout@v6\n      # Uses the `docker/login-action` action to log in to the Container registry registry using the account and password that will publish the packages. Once published, the packages are scoped to the account defined here.\n      - name: Log in to the Container registry\n        uses: docker/login-action@65b78e6e13532edd9afa3aa52ac7964289d1a9c1\n        with:\n          registry: ${{ env.REGISTRY }}\n          username: ${{ github.actor }}\n          password: ${{ secrets.GITHUB_TOKEN }}\n      # This step uses [docker/metadata-action](https://github.com/docker/metadata-action#about) to extract tags and labels that will be applied to the specified image. The `id` \"meta\" allows the output of this step to be referenced in a subsequent step. The `images` value provides the base name for the tags and labels.\n      - name: Extract metadata (tags, labels) for Docker\n        id: meta\n        uses: docker/metadata-action@9ec57ed1fcdbf14dcef7dfbe97b2010124a938b7\n        with:\n          images: ${{ env.REGISTRY }}/${{ env.IMAGE_NAME }}\n      # This step uses the `docker/build-push-action` action to build the image, based on your repository's `Dockerfile`. If the build succeeds, it pushes the image to GitHub Packages.\n      # It uses the `context` parameter to define the build's context as the set of files located in the specified path. For more information, see [Usage](https://github.com/docker/build-push-action#usage) in the README of the `docker/build-push-action` repository.\n      # It uses the `tags` and `labels` parameters to tag and label the image with the output from the \"meta\" step.\n      - name: Build and push Docker image\n        id: push\n        uses: docker/build-push-action@f2a1d5e99d037542a71f64918e516c093c6f3fc4\n        with:\n          context: .\n          push: true\n          tags: ${{ steps.meta.outputs.tags }}\n          labels: ${{ steps.meta.outputs.labels }}\n      \n      # This step generates an artifact attestation for the image, which is an unforgeable statement about where and how it was built. It increases supply chain security for people who consume the image. For more information, see [Using artifact attestations to establish provenance for builds](/actions/security-guides/using-artifact-attestations-to-establish-provenance-for-builds).\n      - name: Generate artifact attestation\n        uses: actions/attest@v4\n        with:\n          subject-name: ${{ env.REGISTRY }}/${{ env.IMAGE_NAME}}\n          subject-digest: ${{ steps.push.outputs.digest }}\n          push-to-registry: true\n      \n```\n\nLe workflow ci-dessus est déclenché par une poussée vers la branche « release ». Il extrait le référentiel GitHub et utilise le `login-action` pour se connecter au Container registry. Il extrait ensuite les étiquettes et les intitulés pour l’image Docker. Enfin, il utilise l'action `build-push-action` pour générer l'image et la publier sur le Container registry.\n\n## Publication d’images sur Docker Hub et GitHub Packages\n\nDans un seul workflow, vous pouvez publier votre image Docker sur plusieurs registres à l’aide des actions `login-action` et `build-push-action` pour chaque registre.\n\nL’exemple de flux de travail suivant utilise les étapes des sections précédentes ([Publishing images to Docker Hub](#publishing-images-to-docker-hub) et [Publishing images to GitHub Packages](#publishing-images-to-github-packages)) pour créer un flux de travail unique qui envoie (push) aux deux registres.\n\n```yaml copy\n# Ce workflow utilise des actions qui ne sont pas certifiées par GitHub.\n# Elles sont fournies par un tiers et régies par\n# des conditions d’utilisation du service, une politique de confidentialité et un support distincts.\n# documentation en ligne.\n\n# GitHub recommande d’épingler les actions à un SHA de commit.\n# Pour obtenir une version plus récente, vous devez mettre à jour le SHA.\n# Vous pouvez également référencer une balise ou une branche, mais l’action peut changer sans avertissement.\n\nname: Publish Docker image\n\non:\n  release:\n    types: [published]\n\njobs:\n  push_to_registries:\n    name: Push Docker image to multiple registries\n    runs-on: ubuntu-latest\n    permissions:\n      packages: write\n      contents: read\n    steps:\n      - name: Check out the repo\n        uses: actions/checkout@v6\n\n      - name: Log in to Docker Hub\n        uses: docker/login-action@f4ef78c080cd8ba55a85445d5b36e214a81df20a\n        with:\n          username: ${{ secrets.DOCKER_USERNAME }}\n          password: ${{ secrets.DOCKER_PASSWORD }}\n\n      - name: Log in to the Container registry\n        uses: docker/login-action@65b78e6e13532edd9afa3aa52ac7964289d1a9c1\n        with:\n          registry: ghcr.io\n          username: ${{ github.actor }}\n          password: ${{ secrets.GITHUB_TOKEN }}\n\n      - name: Extract metadata (tags, labels) for Docker\n        id: meta\n        uses: docker/metadata-action@9ec57ed1fcdbf14dcef7dfbe97b2010124a938b7\n        with:\n          images: |\n            my-docker-hub-namespace/my-docker-hub-repository\n            ghcr.io/${{ github.repository }}\n\n      - name: Build and push Docker images\n        id: push\n        uses: docker/build-push-action@3b5e8027fcad23fda98b2e3ac259d8d67585f671\n        with:\n          context: .\n          push: true\n          tags: ${{ steps.meta.outputs.tags }}\n          labels: ${{ steps.meta.outputs.labels }}\n```\n\nLe flux de travail ci-dessus clone le référentiel GitHub, utilise deux fois le `login-action` pour se connecter aux deux registres et génère des balises et des étiquettes avec l’action `metadata-action`.\nEnsuite, l’action `build-push-action` génère et pousse l’image Docker vers Docker Hub et Container registry.\n\n> \\[!NOTE]\n> Lors du push vers plusieurs registres :\n>\n> * Les synthèses d’images peuvent différer entre les registres, ce qui rend la vérification d’attestation difficile.\n> * Pour maintenir une synthèse cohérente et permettre à une attestation unique de vérifier toutes les copies, poussez d'abord dans un registre et utilisez un outil comme [`crane copy`](https://github.com/google/go-containerregistry/blob/main/cmd/crane/doc/crane_copy.md) pour répliquer l'image ailleurs.\n> * Si vous choisissez de créer et d’envoyer (push) à chaque registre séparément, vous devez générer une attestation distincte pour chacun d'eux afin de vous assurer que vos artéfacts restent vérifiables.\n\n## Travaux pratiques\n\nExercez-vous à publier des images Docker avec l’exercice [Publication d’images Docker](https://github.com/skills/publish-docker-images)GitHub Skills.\n\nDans cet exercice, vous allez apprendre à :\n\n* Authentifiez-vous à GitHub Packages à l'aide de `GITHUB_TOKEN` fichier.\n* Générez et publiez des images conteneur vers le Container registry (`ghcr.io`).\n* Utilisez des actions Docker officielles, telles que `docker/login-action`, `docker/build-push-action`et `docker/setup-buildx-action`.\n* Générez automatiquement des balises `docker/metadata-action` en fonction des branches, des requêtes de tirage et des versions.\n* Créez des fonctionnalités, des requêtes d'extraction et des versions avec un contrôle de version de conteneur approprié."}