{"meta":{"title":"Création d’une action de conteneur Docker","intro":"Dans ce tutoriel, vous allez apprendre à générer une action de conteneur Docker.","product":"GitHub Actions","breadcrumbs":[{"href":"/fr/actions","title":"GitHub Actions"},{"href":"/fr/actions/tutorials","title":"Tutoriels"},{"href":"/fr/actions/tutorials/use-containerized-services","title":"Utilisez des services conteneurisés"},{"href":"/fr/actions/tutorials/use-containerized-services/create-a-docker-container-action","title":"Créer une action de conteneur Docker"}],"documentType":"article"},"body":"# Création d’une action de conteneur Docker\n\nDans ce tutoriel, vous allez apprendre à générer une action de conteneur Docker.\n\n## Introduction\n\nDans ce guide, vous allez découvrir les composants de base qui sont nécessaires pour créer et utiliser une action de conteneur Docker empaquetée. Afin de nous concentrer sur les composants nécessaires à l’empaquetage de l’action, nous avons réduit la fonctionnalité du code de l’action à son strict minimum. L’action affiche « Hello World » dans les journaux ou « Hello \\[who-to-greet] » si vous fournissez un nom personnalisé.\n\nUne fois que vous aurez terminé ce projet, vous saurez comment créer votre propre action de conteneur Docker et la tester dans un workflow.\n\nLes exécuteurs autohébergés doivent utiliser un système d’exploitation Linux et disposer de Docker pour exécuter les actions de conteneur Docker. Pour plus d’informations sur les impératifs des exécuteurs autohébergés, consultez [Exécuteurs auto-hébergés](/fr/actions/hosting-your-own-runners/managing-self-hosted-runners/about-self-hosted-runners#requirements-for-self-hosted-runner-machines).\n\n> \\[!WARNING]\n> Lors de la création de flux de travail et d’actions, vous devez toujours déterminer si votre code pourrait exécuter des entrées non fiables provenant de personnes malveillantes potentielles. Certains contextes doivent être traités comme des entrées non fiables, car un attaquant peut insérer son propre contenu malveillant. Pour plus d’informations, consultez « [Informations de référence sur l’utilisation sécurisée](/fr/actions/security-guides/security-hardening-for-github-actions#understanding-the-risk-of-script-injections) ».\n\n## Prérequis\n\n* Vous devez créer un dépôt sur GitHub et le cloner sur votre station de travail. Pour plus d’informations, consultez « [Création d’un dépôt](/fr/repositories/creating-and-managing-repositories/creating-a-new-repository) » et « [Clonage d’un dépôt](/fr/repositories/creating-and-managing-repositories/cloning-a-repository) ».\n* Si votre référentiel utilise Git LFS, vous devez inclure les objets dans les archives de votre dépôt. Pour plus d’informations, consultez « [Gestion des objets Git LFS dans les archives de votre dépôt](/fr/enterprise-cloud@latest/repositories/managing-your-repositorys-settings-and-features/managing-repository-settings/managing-git-lfs-objects-in-archives-of-your-repository) ».\n* Il peut être utile d'avoir des connaissances de base sur GitHub Actions, les variables d'environnement et le système de fichiers du conteneur Docker. Pour plus d’informations, consultez « [Stocker des informations dans des variables](/fr/actions/learn-github-actions/variables) » et « [Exécuteurs hébergés par GitHub](/fr/enterprise-cloud@latest/actions/using-github-hosted-runners/about-github-hosted-runners#docker-container-filesystem) ».\n\n## Création d’un Dockerfile\n\nDans le nouveau répertoire `hello-world-docker-action`, créez un fichier `Dockerfile`. Vérifiez que le nom de votre fichier est bien en majuscules (utilisez un `D` majuscule et non un `f` majuscule) si vous rencontrez des problèmes. Pour plus d’informations, consultez « [Prise en charge de Dockerfile pour GitHub Actions](/fr/actions/creating-actions/dockerfile-support-for-github-actions) ».\n\n```\n          **Dockerfile**\n```\n\n```dockerfile copy\n# Container image that runs your code\nFROM alpine:3.10\n\n# Copies your code file from your action repository to the filesystem path `/` of the container\nCOPY entrypoint.sh /entrypoint.sh\n\n# Code file to execute when the docker container starts up (`entrypoint.sh`)\nENTRYPOINT [\"/entrypoint.sh\"]\n```\n\n## Création d’un fichier de métadonnées d’action\n\nCréez un fichier `action.yml` dans le répertoire `hello-world-docker-action` que vous avez créé ci-dessus. Pour plus d’informations, consultez « [Référence syntaxique des métadonnées](/fr/actions/creating-actions/metadata-syntax-for-github-actions) ».\n\n**action.yml**\n\n```yaml copy\n# action.yml\nname: 'Hello World'\ndescription: 'Greet someone and record the time'\ninputs:\n  who-to-greet:  # id of input\n    description: 'Who to greet'\n    required: true\n    default: 'World'\noutputs:\n  time: # id of output\n    description: 'The time we greeted you'\nruns:\n  using: 'docker'\n  image: 'Dockerfile'\n  args:\n    - ${{ inputs.who-to-greet }}\n```\n\nCes métadonnées définissent une entrée `who-to-greet` et un paramètre de sortie `time`. Pour passer des entrées au conteneur Docker, vous devez déclarer les entrées à l’aide de `inputs` et les passer dans le mot clé `args`. Tout ce que vous incluez dans `args` est passé au conteneur. Toutefois, pour que les utilisateurs puissent mieux découvrir votre action, nous vous recommandons d’utiliser des entrées.\n\nGitHub crée une image à partir de votre `Dockerfile`et exécute les commandes dans un nouveau conteneur à l’aide de cette image.\n\n## Écriture du code d’action\n\nVous pouvez choisir n’importe quelle image Docker de base et, donc, n’importe quel langage pour votre action. L’exemple de script shell suivant utilise la variable d’entrée `who-to-greet` pour afficher « Hello \\[who-to-greet] » dans le fichier journal.\n\nEnsuite, le script obtient l’heure actuelle et la définit comme une variable de sortie que pourront utiliser les prochaines actions d’un travail. Pour que GitHub reconnaisse les variables de sortie, vous devez les écrire dans le fichier d’environnement `$GITHUB_OUTPUT` : `echo \"<output name>=<value>\" >> $GITHUB_OUTPUT`. Pour plus d’informations, consultez « [Commandes de flux de travail pour GitHub Actions](/fr/actions/using-workflows/workflow-commands-for-github-actions#setting-an-output-parameter) ».\n\n1. Créez un nouveau fichier `entrypoint.sh` dans le répertoire `hello-world-docker-action`.\n\n2. Ajoutez le code suivant à votre fichier `entrypoint.sh`.\n\n   ```\n          **entrypoint.sh**\n   ```\n\n   ```shell copy\n   #!/bin/sh -l\n\n   echo \"Hello $1\"\n   time=$(date)\n   echo \"time=$time\" >> $GITHUB_OUTPUT\n\n   ```\n\n   Si `entrypoint.sh` s’exécute sans erreur, l’état de l’action est défini sur `success`. Pour indiquer l’état d’une action, vous pouvez définir explicitement des codes de sortie dans le code de l’action. Pour plus d’informations, consultez « [Définition des codes de sortie pour les actions](/fr/actions/creating-actions/setting-exit-codes-for-actions) ».\n\n3. Rendez votre fichier `entrypoint.sh` exécutable. Git permet de modifier explicitement le mode d’autorisation d’un fichier afin qu’il ne soit pas réinitialisé chaque fois qu’il existe un clone/une duplication.\n\n   ```shell copy\n   git add entrypoint.sh\n   git update-index --chmod=+x entrypoint.sh\n   ```\n\n4. Si vous le souhaitez, pour vérifier le mode d’autorisation du fichier dans l’index git, exécutez la commande suivante.\n\n   ```shell copy\n   git ls-files --stage entrypoint.sh\n   ```\n\n   Une sortie comme `100755 e69de29bb2d1d6434b8b29ae775ad8c2e48c5391 0       entrypoint.sh` signifie que le fichier dispose de l’autorisation exécutable. Dans cet exemple, `755` indique l’autorisation exécutable.\n\n## Création d’un fichier README\n\nPour expliquer aux utilisateurs comment utiliser votre action, vous pouvez créer un fichier README. Un fichier README est très utile si vous prévoyez de partager votre action publiquement, mais c’est aussi un excellent moyen de vous rappeler comment utiliser l’action.\n\nDans votre répertoire `hello-world-docker-action`, créez un fichier `README.md` qui spécifie les informations suivantes :\n\n* Une description détaillée de ce que fait l’action.\n* Les arguments d’entrée et de sortie obligatoires.\n* Les arguments d’entrée et de sortie facultatifs.\n* Les secrets utilisés par l’action.\n* Les variables d’environnement utilisées par l’action.\n* Un exemple d’utilisation de votre action dans un workflow.\n\n  ```\n          **README.md**\n  ```\n\n```markdown copy\n# Hello world docker action\n\nThis action prints \"Hello World\" or \"Hello\" + the name of a person to greet to the log.\n\n## Inputs\n\n## `who-to-greet`\n\n**Required** The name of the person to greet. Default `\"World\"`.\n\n## Outputs\n\n## `time`\n\nThe time we greeted you.\n\n## Example usage\n\nuses: actions/hello-world-docker-action@v2\nwith:\n  who-to-greet: 'Mona the Octocat'\n```\n\n## Valider, baliser et envoyer votre action\n\nÀ partir de votre terminal, commitez vos fichiers `action.yml`, `entrypoint.sh`, `Dockerfile` et `README.md`.\n\nIl est recommandé d’ajouter également une étiquette de version pour les versions de votre action. Pour plus d’informations sur le versioning de votre action, consultez « [À propos des actions personnalisées](/fr/actions/creating-actions/about-custom-actions#using-release-management-for-actions) ».\n\n```shell copy\ngit add action.yml entrypoint.sh Dockerfile README.md\ngit commit -m \"My first action is ready\"\ngit tag -a -m \"My first action release\" v1\ngit push --follow-tags\n```\n\n## Tester votre action dans un workflow\n\nVous êtes maintenant prêt à tester votre action dans un workflow.\n\n* Lorsqu’une action se trouve dans un référentiel privé, vous pouvez contrôler qui peut y accéder. Pour plus d’informations, consultez « [Gestion des paramètres de GitHub Actions pour un référentiel](/fr/repositories/managing-your-repositorys-settings-and-features/enabling-features-for-your-repository/managing-github-actions-settings-for-a-repository#allowing-access-to-components-in-a-private-repository) ».\n* Lorsqu’une action se trouve dans un référentiel interne, l’action ne peut être utilisée que dans les workflows du même référentiel.\n* Les actions publiques peuvent être utilisées par les workflows dans n’importe quel dépôt.\n\n### Exemple utilisant une action publique\n\nLe code du workflow suivant utilise l’action *hello world* terminée dans le dépôt public [`actions/hello-world-docker-action`](https://github.com/actions/hello-world-docker-action). Copiez l’exemple de code de workflow suivant dans un fichier `.github/workflows/main.yml`, en remplaçant `actions/hello-world-docker-action` par le nom de votre dépôt et le nom de votre action. Vous pouvez également remplacer l’entrée `who-to-greet` par votre nom. Les actions publiques peuvent être utilisées même si elles ne sont pas publiées dans GitHub Marketplace. Pour plus d’informations, consultez « [Publication d’actions dans GitHub Marketplace](/fr/actions/creating-actions/publishing-actions-in-github-marketplace#publishing-an-action) ».\n\n```\n          **.github/workflows/main.yml**\n```\n\n```yaml copy\non: [push]\n\njobs:\n  hello_world_job:\n    runs-on: ubuntu-latest\n    name: A job to say hello\n    steps:\n      - name: Hello world action step\n        id: hello\n        uses: actions/hello-world-docker-action@v2\n        with:\n          who-to-greet: 'Mona the Octocat'\n      # Use the output from the `hello` step\n      - name: Get the output time\n        run: echo \"The time was ${{ steps.hello.outputs.time }}\"\n```\n\n### Exemple utilisant une action privée\n\nCopiez le code de l’exemple de workflow suivant dans un fichier `.github/workflows/main.yml` du dépôt de votre action. Vous pouvez également remplacer l’entrée `who-to-greet` par votre nom.  Cette action privée ne peut pas être publiée dans GitHub Marketplace, et ne peut être utilisée que dans ce dépôt.\n\n```\n          **.github/workflows/main.yml**\n```\n\n```yaml copy\non: [push]\n\njobs:\n  hello_world_job:\n    runs-on: ubuntu-latest\n    name: A job to say hello\n    steps:\n      # To use this repository's private action,\n      # you must check out the repository\n      - name: Checkout\n        uses: actions/checkout@v6\n      - name: Hello world action step\n        uses: ./ # Uses an action in the root directory\n        id: hello\n        with:\n          who-to-greet: 'Mona the Octocat'\n      # Use the output from the `hello` step\n      - name: Get the output time\n        run: echo \"The time was ${{ steps.hello.outputs.time }}\"\n```\n\nDans votre dépôt, cliquez sur l’onglet **Actions**, puis sélectionnez la dernière exécution du workflow. Sous **Travaux** ou dans le graphe de visualisation, cliquez sur **A job to say hello**.\n\nCliquez sur **Hello world action step** et vous devriez voir « Hello Mona the Octocat » ou le nom que vous avez utilisé pour l’entrée `who-to-greet` imprimée dans le journal. Pour voir l’horodatage, cliquez sur **Obtenir l’heure de la sortie**.\n\n## Accès aux fichiers créés par une action de conteneur\n\nQuand une action de conteneur s’exécute, elle mappe automatiquement le répertoire de travail par défaut (`GITHUB_WORKSPACE`) sur l’exécuteur avec l’annuaire `/github/workspace` du conteneur. Tous les fichiers ajoutés à cet annuaire sur le conteneur seront disponibles pour toutes les étapes suivantes du même projet. Par exemple, si vous disposez d’une action de conteneur qui génère votre projet et que vous souhaitez télécharger la sortie du build en tant qu’artefact, vous pouvez utiliser les étapes suivantes.\n\n```\n          **workflow.yml**\n```\n\n```yaml copy\njobs:\n  build:\n    runs-on: ubuntu-latest\n    steps:\n      - name: Checkout\n        uses: actions/checkout@v6\n\n      # Output build artifacts to /github/workspace on the container.\n      - name: Containerized Build\n        uses: ./.github/actions/my-container-action\n\n      - name: Upload Build Artifacts\n        uses: actions/upload-artifact@v4\n        with:\n          name: workspace_artifacts\n          path: ${{ github.workspace }}\n```\n\nPour plus d’informations sur le chargement de la sortie du build en tant qu’artefact, consultez « [Stocker et partager des données avec les artefacts de workflow](/fr/actions/using-workflows/storing-workflow-data-as-artifacts) ».\n\n## Exemples d’actions de conteneur Docker sur GitHub.com\n\nVous pouvez trouver de nombreux exemples d’actions de conteneur Docker sur GitHub.com.\n\n* [github/issue-metrics](https://github.com/github/issue-metrics)\n* [microsoft/infersharpaction](https://github.com/microsoft/infersharpaction)\n* [microsoft/ps-docs](https://github.com/microsoft/ps-docs)"}