{"meta":{"title":"Prise en charge de Dockerfile pour GitHub Actions","intro":"Lors de la création d’une Dockerfile pour une action de conteneur Docker, vous devez savoir comment certaines instructions Docker interagissent avec GitHub Actions et le fichier de métadonnées d’une action.","product":"GitHub Actions","breadcrumbs":[{"href":"/fr/enterprise-server@3.22/actions","title":"GitHub Actions"},{"href":"/fr/enterprise-server@3.22/actions/reference","title":"Référence"},{"href":"/fr/enterprise-server@3.22/actions/reference/workflows-and-actions","title":"Flux de travail et actions"},{"href":"/fr/enterprise-server@3.22/actions/reference/workflows-and-actions/dockerfile-support","title":"Prise en charge de Dockerfile"}],"documentType":"article"},"body":"# Prise en charge de Dockerfile pour GitHub Actions\n\nLors de la création d’une Dockerfile pour une action de conteneur Docker, vous devez savoir comment certaines instructions Docker interagissent avec GitHub Actions et le fichier de métadonnées d’une action.\n\n> \\[!NOTE]\n> Les exécuteurs hébergés sur GitHub Enterprise Server ne sont pas pris en charge sur GitHub.\n\n### Utilisateur\n\nLes actions Docker doivent être exécutées par l’utilisateur Docker par défaut (racine). N’utilisez pas l’instruction `USER` dans votre `Dockerfile`, car vous ne pouvez pas accéder au répertoire `GITHUB_WORKSPACE`. Pour plus d’informations, consultez « [Références des variables](/fr/enterprise-server@3.22/actions/reference/workflows-and-actions/variables#default-environment-variables) » et [USER reference](https://docs.docker.com/engine/reference/builder/#user) dans la documentation Docker.\n\n### FROM\n\nLa première instruction du fichier `Dockerfile` doit être `FROM`, qui sélectionne une image de base Docker. Pour plus d’informations, consultez [FROM reference](https://docs.docker.com/engine/reference/builder/#from) dans la documentation Docker.\n\nVoici quelques bonnes pratiques concernant la définition de l’argument `FROM` :\n\n* Il est recommandé d’utiliser des images Docker officielles. Par exemple, `python` ou `ruby`.\n* Utilisez une étiquette de version s’il en existe une, de préférence avec une version principale. Par exemple, utilisez `node:10` au lieu de `node:latest`.\n* Il est recommandé d’utiliser des images Docker basées sur le système d’exploitation [Debian](https://www.debian.org/).\n\n### WORKDIR\n\nGitHub définit le chemin du répertoire de travail dans la variable d’environnement `GITHUB_WORKSPACE` . Il est recommandé de ne pas utiliser l’instruction `WORKDIR` dans votre `Dockerfile`. Avant l’exécution de l’action, GitHub montera le répertoire `GITHUB_WORKSPACE` à la place de tout ce qui se trouvait à cet emplacement dans l’image Docker et définira `GITHUB_WORKSPACE` comme répertoire de travail. Pour plus d’informations, consultez « [Références des variables](/fr/enterprise-server@3.22/actions/reference/workflows-and-actions/variables#default-environment-variables) » et [WORKDIR reference](https://docs.docker.com/engine/reference/builder/#workdir) dans la documentation Docker.\n\n### Point d'entrée\n\nSi vous définissez `entrypoint` dans le fichier de métadonnées d’une action, cela remplacera le fichier `ENTRYPOINT` défini dans le `Dockerfile`. Pour plus d’informations, consultez « [Référence syntaxique des métadonnées](/fr/enterprise-server@3.22/actions/reference/workflows-and-actions/metadata-syntax#runsentrypoint) ».\n\nL’instruction Docker `ENTRYPOINT` peut avoir un format *shell* ou un format *exec*. La documentation Docker `ENTRYPOINT` recommande d’utiliser le format *exec* de l’instruction `ENTRYPOINT`. Pour plus d’informations sur les formats *exec* et *shell*, consultez la [ENTRYPOINT reference](https://docs.docker.com/engine/reference/builder/#entrypoint) dans la documentation Docker.\n\nVous ne devez pas utiliser `WORKDIR` pour spécifier votre point d’entrée dans le Dockerfile. Au lieu de cela, vous devez utiliser un chemin absolu. Pour plus d’informations, consultez [WORKDIR](#workdir).\n\nSi vous configurez votre conteneur pour utiliser le format *exec* de l’instruction `ENTRYPOINT`, les `args` configurés dans le fichier de métadonnées de l’action ne s’exécuteront pas dans un interpréteur de commandes. Si les `args` de l’action contiennent une variable d’environnement, celle-ci ne sera pas substituée. Par exemple, l’utilisation du format *exec* suivant n’affiche pas la valeur stockée dans `$GITHUB_SHA`, mais affiche `\"$GITHUB_SHA\"` à la place.\n\n```dockerfile\nENTRYPOINT [\"echo $GITHUB_SHA\"]\n```\n\nSi vous souhaitez une substitution de variable, utilisez le format *shell* ou exécutez directement un interpréteur de commandes. Par exemple, à l’aide du format *exec* suivant, vous pouvez exécuter un interpréteur de commandes pour afficher la valeur stockée dans la variable d’environnement `GITHUB_SHA`.\n\n```dockerfile\nENTRYPOINT [\"sh\", \"-c\", \"echo $GITHUB_SHA\"]\n```\n\nPour fournir les `args` définis dans le fichier de métadonnées de l’action à un conteneur Docker qui utilise le format *exec* dans `ENTRYPOINT`, nous vous recommandons de créer un script shell nommé `entrypoint.sh` que vous appellerez à partir de l’instruction `ENTRYPOINT` :\n\n#### Exemple de *Dockerfile*\n\n```dockerfile\n# Container image that runs your code\nFROM debian:9.5-slim\n\n# Copies your code file from your action repository to the filesystem path `/` of the container\nCOPY entrypoint.sh /entrypoint.sh\n\n# Executes `entrypoint.sh` when the Docker container starts up\nENTRYPOINT [\"/entrypoint.sh\"]\n```\n\n#### Exemple de fichier *entrypoint.sh*\n\nEn utilisant l’exemple de Dockerfile ci-dessus, GitHub enverra le `args` configuré dans le fichier de métadonnées de l’action comme arguments à `entrypoint.sh`. Ajoutez le `#!/bin/sh`[shebang](https://en.wikipedia.org/wiki/Shebang_\\(Unix\\)) en haut du fichier `entrypoint.sh` pour utiliser explicitement l’interpréteur de commandes compatible [POSIX](https://en.wikipedia.org/wiki/POSIX) du système.\n\n```shell\n#!/bin/sh\n\n# `$#` expands to the number of arguments and `$@` expands to the supplied `args`\nprintf '%d args:' \"$#\"\nprintf \" '%s'\" \"$@\"\nprintf '\\n'\n```\n\nVotre code doit être exécutable. Vérifiez que le fichier `entrypoint.sh` dispose d’autorisations `execute` avant de l’utiliser dans un workflow. Vous pouvez modifier l’autorisation à partir de votre terminal à l’aide de cette commande :\n\n```shell\nchmod +x entrypoint.sh\n```\n\nLorsqu’un script shell `ENTRYPOINT` n’est pas exécutable, vous recevez une erreur similaire à celle-ci :\n\n```shell\nError response from daemon: OCI runtime create failed: container_linux.go:348: starting container process caused \"exec: \\\"/entrypoint.sh\\\": permission denied\": unknown\n```\n\n### CMD\n\nSi vous définissez `args` dans le fichier de métadonnées de l’action, `args` remplacera l’instruction `CMD` spécifiée dans le fichier de métadonnées de l’action `Dockerfile`. Pour plus d’informations, consultez « [Référence syntaxique des métadonnées](/fr/enterprise-server@3.22/actions/reference/workflows-and-actions/metadata-syntax#runsargs) ».\n\nSi vous utilisez `CMD` dans votre `Dockerfile`application, suivez les instructions suivantes :\n\n1. Documentez les arguments requis dans le fichier README de l’action et omettez-les de l’instruction `CMD`.\n2. Utilisez les valeurs par défaut qui autorisent l’utilisation de l’action sans spécifier aucune valeur `args`.\n3. Si l’action expose un indicateur `--help`, ou quelque chose de similaire, utilisez-le pour rendre votre action auto-documentée.\n\n## Fonctionnalités Linux prises en charge\n\nGitHub Actions prend en charge les fonctionnalités Linux par défaut prises en charge par Docker. Il n’est pas possible d’ajouter ni de supprimer des fonctionnalités. Pour plus d’informations sur les fonctionnalités Linux par défaut qui sont prises en charge par Docker, consultez « [Capacités du noyau Linux](https://docs.docker.com/engine/security/#linux-kernel-capabilities) » dans la documentation Docker. Pour en savoir plus sur les fonctionnalités Linux, consultez « [Overview of Linux capabilities](http://man7.org/linux/man-pages/man7/capabilities.7.html) » dans les pages de manuel Linux."}