Skip to main content

Running jobs in a container

Use a container to run the steps in a job.

Hinweis

Auf GitHub gehostete Runner werden aktuell nicht auf GitHub Enterprise Server unterstützt. Weitere Informationen zur geplanten zukünftigen Unterstützung findest Du in der GitHub public roadmap.

Overview

Verwende jobs.<job_id>.container, um einen Container zu erstellen, in dem alle Schritte eines Jobs ausgeführt werden, die noch keinen Container angeben. Wenn ein Schritt sowohl Skript- als auch Container-Aktionen umfasst, werden die Container-Aktionen als nebengeordnete Container in demselben Netzwerk mit denselben Volume-Mounts ausgeführt.

Wenn du keinen container festlegst, werden alle Schritte direkt auf dem durch runs-on angegebenen Host ausgeführt, es sei denn, ein Schritt bezieht sich auf eine Aktion, die für die Ausführung in einem Container konfiguriert ist.

Hinweis

Die Standardshell für run-Schritte innerhalb eines Containers lautet sh anstatt bash. Dies kann mit jobs.<job_id>.defaults.run oder jobs.<job_id>.steps[*].shell überschrieben werden.

Beispiel: Ausführen eines Auftrags innerhalb eines Containers

YAML
name: CI
on:
  push:
    branches: [ main ]
jobs:
  container-test-job:
    runs-on: ubuntu-latest
    container:
      image: node:18
      env:
        NODE_ENV: development
      ports:
        - 80
      volumes:
        - my_docker_volume:/volume_mount
      options: --cpus 1
    steps:
      - name: Check for dockerenv file
        run: (ls /.dockerenv && echo Found dockerenv) || (echo No dockerenv)

Wenn du nur ein Containerimage angibst, kannst du das image-Schlüsselwort weglassen.

jobs:
  container-test-job:
    runs-on: ubuntu-latest
    container: node:18

Defining the container image

Verwende jobs.<job_id>.container.image, um das Docker-Image zu definieren, das beim Ausführen der Aktion als Container herangezogen wird. Der Wert kann der Name des Docker Hub-Images oder ein Registrierungsname sein.

Hinweis

Docker Hub erzwingt in der Regel Grenzwerte für Push- und Pullvorgänge, die sich auf Aufträge auf selbstgehosteten Runnern auswirken. Über GitHub gehostete Runner unterliegen diesen Grenzwerten jedoch basierend auf einer Vereinbarung zwischen GitHub und Docker nicht.

Defining credentials for a container registry

Wenn die Containerregistrierung des Images eine Authentifizierung benötigt, damit das Image gepullt werden kann, kannst du mit jobs.<job_id>.container.credentials eine map von username und password festlegen. Die Anmeldeinformationen sind dieselben Werte, die du für den docker login-Befehl angeben würdest.

Beispiel: Definieren der Anmeldeinformationen für eine Containerregistrierung

container:
  image: ghcr.io/owner/image
  credentials:
     username: ${{ github.actor }}
     password: ${{ secrets.github_token }}

Using environment variables with a container

Verwende jobs.<job_id>.container.env, um eine map von Umgebungsvariablen im Dienstcontainer einzustellen.

Exposing network ports on a container

Verwende jobs.<job_id>.container.ports zum Festlegen eines array aus Ports, die für den Container verfügbar gemacht werden sollen.

Mounting volumes in a container

Verwende jobs.<job_id>.container.volumes zum Festlegen eines array von Volumes, die der Container verwenden soll. Mithilfe von Volumes kannst Du Daten zwischen Diensten oder anderen Schritten in einem Job austauschen. Du kannst benannte Docker-Volumes, anonyme Docker-Volumes oder Bind-Mounts auf dem Host angegeben.

Um ein Volume festzulegen, gibst du den Quell- und Zielpfad an:

<source>:<destinationPath>.

<source> ist ein Volumename oder ein absoluter Pfad auf dem Hostcomputer, und <destinationPath> ist ein absoluter Pfad im Container.

Beispiel: Einbinden von Volumes in einem Container

volumes:
  - my_docker_volume:/volume_mount
  - /data/my_data
  - /source/directory:/destination/directory

Setting container resource options

Verwende jobs.<job_id>.container.options zum Konfigurieren zusätzlicher Optionen für Docker-Containerressourcen. Eine Liste der Optionen findest du unter docker create-Optionen.

Warnung

Die Optionen --network und --entrypoint werden nicht unterstützt.