{"meta":{"title":"Dockerfile Unterstützung für GitHub Aktionen","intro":"Beim Erstellen eines Dockerfile für eine Docker-Containeraktion solltest du wissen, wie bestimmte Docker-Anweisungen mit GitHub Actions und der Metadatendatei einer Aktion interagieren.","product":"GitHub Actions","breadcrumbs":[{"href":"/de/actions","title":"GitHub Actions"},{"href":"/de/actions/reference","title":"Verweis"},{"href":"/de/actions/reference/workflows-and-actions","title":"Workflows und Aktionen"},{"href":"/de/actions/reference/workflows-and-actions/dockerfile-support","title":"Dockerfile-Unterstützung"}],"documentType":"article"},"body":"# Dockerfile Unterstützung für GitHub Aktionen\n\nBeim Erstellen eines Dockerfile für eine Docker-Containeraktion solltest du wissen, wie bestimmte Docker-Anweisungen mit GitHub Actions und der Metadatendatei einer Aktion interagieren.\n\n### Benutzer\n\nDocker-Aktionen müssen vom Standard-Benutzer (root) des Dockers ausgeführt werden. Verwende die `USER`-Anweisung nicht in deinem `Dockerfile`, da du dann nicht mehr auf das Verzeichnis `GITHUB_WORKSPACE` zugreifen kannst. Weitere Informationen findest du in der Docker-Dokumentation unter [Referenz für Variablen](/de/actions/reference/workflows-and-actions/variables#default-environment-variables) und der [USER-Referenz](https://docs.docker.com/engine/reference/builder/#user).\n\n### FROM\n\nDie erste Anweisung in der `Dockerfile` muss `FROM` sein, wodurch ein Docker-Basisimage ausgewählt wird. Weitere Informationen findest du in der Docker-Dokumentation unter [FROM-Referenz](https://docs.docker.com/engine/reference/builder/#from).\n\nDies sind einige bewährte Methoden, das `FROM`-Argument zu nutzen:\n\n* Es wird empfohlen, offizielle Docker-Images (Abbilder) zu verwenden. Zum Beispiel: `python` oder `ruby`.\n* Verwende ein Versions-Tag, falls vorhanden, vorzugsweise mit einer Hauptversion. Verwenden Sie z. B. `node:10` statt `node:latest`.\n* Es wird empfohlen, Docker-Images zu verwenden, die auf dem [Debian-Betriebssystem](https://www.debian.org/) basieren.\n\n### WORKDIR\n\nGitHub legt den Arbeitsverzeichnispfad in der Umgebungsvariable `GITHUB_WORKSPACE` fest. Es wird empfohlen, die `WORKDIR`-Anweisung nicht in deiner `Dockerfile` zu verwenden. Bevor die Aktion ausgeführt wird, hängt GitHub das Verzeichnis `GITHUB_WORKSPACE` über alles ein, was sich im Docker-Image an dieser Stelle befand, und legt `GITHUB_WORKSPACE` als Arbeitsverzeichnis fest. Weitere Informationen findest du in der Docker-Dokumentation unter [Referenz für Variablen](/de/actions/reference/workflows-and-actions/variables#default-environment-variables) und der [WORKDIR-Referenz](https://docs.docker.com/engine/reference/builder/#workdir).\n\n### ENTRYPOINT\n\nWenn Sie `entrypoint` in der Metadatendatei einer Aktion definieren, wird `ENTRYPOINT`, das in der `Dockerfile` festgelegt ist, außer Kraft gesetzt. Weitere Informationen finden Sie unter [Referenz zur Metadatensyntax](/de/actions/reference/workflows-and-actions/metadata-syntax#runsentrypoint).\n\nFür die Docker-Anweisung `ENTRYPOINT` gibt es ein *Shellformat* und ein *Ausführungsformat*. In der Docker-Dokumentation zu `ENTRYPOINT` wird das *Ausführungsformat* der `ENTRYPOINT`-Anweisung empfohlen. Weitere Informationen zum *Ausführungsformat* und *Shellformat* findest du in der Docker-Dokumentation in der [ENTRYPOINT-Referenz](https://docs.docker.com/engine/reference/builder/#entrypoint).\n\nVerwende `WORKDIR` nicht, um deinen Einstiegspunkt in deiner Dockerfile-Datei anzugeben. Verwende stattdessen einen absoluten Pfad. Weitere Informationen findest du unter [WORKDIR](#workdir).\n\nWenn du deinen Container so konfigurierst, dass er das *Ausführungsformat* der `ENTRYPOINT`-Anweisung verwendet, wird die in der Metadatendatei der Aktion konfigurierte `args` nicht in einer Befehlsshell ausgeführt. Wenn die `args` der Aktion eine Umgebungsvariable enthalten, wird die Variable nicht ersetzt. Wenn du beispielsweise das folgende *Ausführungsformat* verwendest, wird der in `$GITHUB_SHA` gespeicherte Wert nicht ausgegeben, sondern stattdessen wird `\"$GITHUB_SHA\"` ausgegeben.\n\n```dockerfile\nENTRYPOINT [\"echo $GITHUB_SHA\"]\n```\n\nWenn du eine Variable ersetzen möchtest, verwende entweder das *Shellformat*, oder du führst direkt eine Shell aus. Mit dem folgenden *Ausführungsformat* kannst du zum Beispiel eine Shell ausführen, um den in der Umgebungsvariablen `GITHUB_SHA` gespeicherten Wert auszugeben.\n\n```dockerfile\nENTRYPOINT [\"sh\", \"-c\", \"echo $GITHUB_SHA\"]\n```\n\nUm die in der Metadatendatei der Aktion definierten `args` an einen Docker-Container zu übergeben, der das *Ausführungsformat* im `ENTRYPOINT` verwendet, empfiehlt es sich, ein Shellskript namens `entrypoint.sh` zu erstellen, das über die `ENTRYPOINT`-Anweisung aufgerufen wird:\n\n#### Beispiel für *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#### Beispieldatei für *entrypoint.sh*\n\nUnter Verwendung des obigen Beispiel-Dockerfiles sendet GitHub das in der Metadatendatei der Aktion konfigurierte `args` als Argumente an `entrypoint.sh`. Füge die `#!/bin/sh`[shebang](https://en.wikipedia.org/wiki/Shebang_\\(Unix\\)) oben in der `entrypoint.sh`-Datei hinzu, um die [POSIX-kompatible](https://en.wikipedia.org/wiki/POSIX) Shell des Systems explizit zu verwenden.\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\nDein Code muss ausführbar sein. Stelle sicher, dass die `entrypoint.sh`-Datei über `execute`-Berechtigungen verfügt, bevor du sie in einem Workflow verwendest. Du kannst die Berechtigung von deinem Terminal aus mit diesem Befehl ändern:\n\n```shell\nchmod +x entrypoint.sh\n```\n\nWenn ein `ENTRYPOINT`-Shellskript nicht ausführbar ist, wird ein Fehler wie der folgende angezeigt:\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### Befehlszeile\n\nWenn du in der Metadatendatei der Aktion `args` definierst, überschreibt `args` die `CMD`-Anweisung, die in der `Dockerfile` angegeben ist. Weitere Informationen finden Sie unter [Referenz zur Metadatensyntax](/de/actions/reference/workflows-and-actions/metadata-syntax#runsargs).\n\nWenn Sie `CMD` in Ihrem `Dockerfile` verwenden, befolgen Sie die folgenden Richtlinien:\n\n1. Dokumentieren die erforderlichen Argumente in der README-Datei der Aktion, und lasse sie in der `CMD`-Anweisung weg.\n2. Verwende Standardwerte, die die Verwendung der Aktion ohne die Angabe von `args` ermöglichen.\n3. Wenn die Aktion ein `--help`-Flag oder etwas ähnliches verfügbar macht, verwende dies, damit die Aktion selbstdokumentierend wird.\n\n## Unterstützte Linux-Funktionen\n\nGitHub Actions unterstützt die standardmäßigen Linux-Funktionen, die Docker unterstützt. Funktionen können weder hinzugefügt noch entfernt werden. Weitere Informationen zu den standardmäßigen Linux-Funktionen, die Docker unterstützt, findest du in der Docker-Dokumentation unter [Linux-Kernelfunktionen](https://docs.docker.com/engine/security/#linux-kernel-capabilities). Weitere Informationen zu Linux-Funktionen findest du unter [Übersicht über Linux-Funktionen](http://man7.org/linux/man-pages/man7/capabilities.7.html) auf den Linux-Man-Seiten."}