{"meta":{"title":"Redis-Service-Container erstellen","intro":"Du kannst Service-Container verwenden, um einen Redis-Client in Deinem Workflow zu erstellen. Dieser Leitfaden zeigt Beispiele für die Erstellung eines Redis-Dienstes für Jobs, die in Containern oder direkt auf der Runner-Maschine ausgeführt werden.","product":"GitHub Actions","breadcrumbs":[{"href":"/de/actions","title":"GitHub Actions"},{"href":"/de/actions/tutorials","title":"Anleitungen"},{"href":"/de/actions/tutorials/use-containerized-services","title":"Verwenden von Containerdiensten"},{"href":"/de/actions/tutorials/use-containerized-services/create-redis-service-containers","title":"Erstellen von Redis-Dienstcontainern"}],"documentType":"article"},"body":"# Redis-Service-Container erstellen\n\nDu kannst Service-Container verwenden, um einen Redis-Client in Deinem Workflow zu erstellen. Dieser Leitfaden zeigt Beispiele für die Erstellung eines Redis-Dienstes für Jobs, die in Containern oder direkt auf der Runner-Maschine ausgeführt werden.\n\n## Einführung\n\nDieser Leitfaden zeigt Ihnen Workflowbeispiele, die einen Servercontainer mithilfe des Docker-Hub-Images `redis` konfigurieren. Der Workflow führt ein Skript aus, um einen Redis-Client zu erstellen und den Client mit Daten zu füllen. Um zu testen, ob der Workflow den Redis-Client erstellt und mit Daten füllt, gibt das Skript die Daten des Clients auf der Konsole aus.\n\n> \\[!NOTE]\n> Wenn bei deinen Workflows Docker-Containeraktionen, Auftragscontainer oder Dienstcontainer verwendet werden, musst du einen Linux-Runner nutzen:\n>\n> * Wenn du GitHub-gehostete Runner verwendest, musst du einen Ubuntu-Runner verwenden.\n> * Wenn du selbst gehostete Läufer verwendest, musst du einen Linux-Rechner als deinen Läufer verwenden und Docker muss installiert sein.\n\n## Voraussetzungen\n\nSie sollten mit dem Zusammenspiel von Dienstcontainern mit GitHub Actions und den Netzwerkunterschieden zwischen dem direkten Ausführen von Jobs auf dem Runner und dem Ausführen in einem Container vertraut sein. Weitere Informationen finden Sie unter [Kommunizieren mit Docker-Dienstcontainern](/de/actions/tutorials/use-containerized-services/use-docker-service-containers).\n\nMöglicherweise ist es auch hilfreich, ein grundlegendes Verständnis von YAML, der Syntax für GitHub Actionsund Redis zu haben. Weitere Informationen finden Sie unter:\n\n* [Schreiben von Workflows](/de/actions/how-tos/write-workflows)\n* [Erste Schritte mit Redis](https://redis.io/learn/howtos/quick-start) in der Redis-Dokumentation\n\n## Jobs in Containern ausführen\n\nDas Konfigurieren von Aufträgen für die Ausführung in einem Container vereinfacht die Netzwerkkonfigurationen zwischen dem Auftrag und den Dienstcontainern. Docker-Container im gleichen benutzerdefinierten Bridge-Netzwerk exponieren gegenseitig alle Ports, sodass Du keinen der Servicecontainer-Ports dem Docker-Host zuordnen musst. Mit der im Workflow konfigurierten Kennzeichnung kannst Du vom Auftrags-Container her auf den Dienst-Container zugreifen.\n\nDu kannst diese Workflowdatei in das `.github/workflows`-Verzeichnis deines Repositorys kopieren und nach Bedarf ändern.\n\n```yaml copy\nname: Redis container example\non: push\n\njobs:\n  # Label of the container job\n  container-job:\n    # Containers must run in Linux based operating systems\n    runs-on: ubuntu-latest\n    # Docker Hub image that `container-job` executes in\n    container: node:20-bookworm-slim\n\n    # Service containers to run with `container-job`\n    services:\n      # Label used to access the service container\n      redis:\n        # Docker Hub image\n        image: redis\n        # Set health checks to wait until redis has started\n        options: >-\n          --health-cmd \"redis-cli ping\"\n          --health-interval 10s\n          --health-timeout 5s\n          --health-retries 5\n\n    steps:\n      # Downloads a copy of the code in your repository before running CI tests\n      - name: Check out repository code\n        uses: actions/checkout@v6\n\n      # Performs a clean installation of all dependencies in the `package.json` file\n      # For more information, see https://docs.npmjs.com/cli/ci.html\n      - name: Install dependencies\n        run: npm ci\n\n      - name: Connect to Redis\n        # Runs a script that creates a Redis client, populates\n        # the client with data, and retrieves data\n        run: node client.js\n        # Environment variable used by the `client.js` script to create a new Redis client.\n        env:\n          # The hostname used to communicate with the Redis service container\n          REDIS_HOST: redis\n          # The default Redis port\n          REDIS_PORT: 6379\n```\n\n### Den Container-Job konfigurieren\n\nDieser Workflow konfiguriert einen Auftrag, der im Container `node:20-bookworm-slim` ausgeführt wird, und nutzt den  GitHub-gehosteten Runner `ubuntu-latest` als Docker-Host für den Container. Weitere Informationen zum Container `node:20-bookworm-slim` findest Du im [Knotenimage](https://hub.docker.com/_/node) auf Docker Hub.\n\nDer Workflow konfiguriert einen Dienstcontainer mit der Bezeichnung `redis`. Alle Dienste müssen in einem Container ausgeführt werden, daher erfordert jeder Dienst die Angabe des Containers `image`. Dieses Beispiel verwendet das `redis`-Containerimage und enthält Optionen für Integritätsüberprüfungen, um die Ausführung des Diensts sicherzustellen. Füge dem Imagenamen ein Tag an, um eine Version anzugeben, z. B. `redis:6`. Weitere Informationen findest du im [Redis-Image](https://hub.docker.com/_/redis) für Docker Hub.\n\n```yaml copy\njobs:\n  # Label of the container job\n  container-job:\n    # Containers must run in Linux based operating systems\n    runs-on: ubuntu-latest\n    # Docker Hub image that `container-job` executes in\n    container: node:20-bookworm-slim\n\n    # Service containers to run with `container-job`\n    services:\n      # Label used to access the service container\n      redis:\n        # Docker Hub image\n        image: redis\n        # Set health checks to wait until redis has started\n        options: >-\n          --health-cmd \"redis-cli ping\"\n          --health-interval 10s\n          --health-timeout 5s\n          --health-retries 5\n```\n\n### Konfigurieren der Schritte für den Containerauftrag\n\nDer Workflow führt die folgenden Schritte aus:\n\n1. Auschecken des Repository auf dem Läufer\n2. Installieren von Abhängigkeiten\n3. Ausführen eines Script, um einen Client zu erstellen\n\n```yaml copy\nsteps:\n  # Downloads a copy of the code in your repository before running CI tests\n  - name: Check out repository code\n    uses: actions/checkout@v6\n\n  # Performs a clean installation of all dependencies in the `package.json` file\n  # For more information, see https://docs.npmjs.com/cli/ci.html\n  - name: Install dependencies\n    run: npm ci\n\n  - name: Connect to Redis\n    # Runs a script that creates a Redis client, populates\n    # the client with data, and retrieves data\n    run: node client.js\n    # Environment variable used by the `client.js` script to create a new Redis client.\n    env:\n      # The hostname used to communicate with the Redis service container\n      REDIS_HOST: redis\n      # The default Redis port\n      REDIS_PORT: 6379\n```\n\nDas *client.js*-Skript sucht nach den Umgebungsvariablen `REDIS_HOST` und `REDIS_PORT`, um den Client zu erstellen. Der Workflow legt diese beiden Umgebungsvariablen im Rahmen des Schritts „Mit Redis verbinden“ fest, um sie dem *client.js*-Skript zur Verfügung zu stellen. Weitere Informationen zum Skript findest du unter [Testen des Redis-Dienstcontainers](#testing-the-redis-service-container).\n\nDer Hostname des Redis-Diensts ist die Bezeichnung, die du in deinem Workflow konfiguriert hast (in diesem Fall: `redis`). Da Docker-Container im selben benutzerdefinierten Bridge-Netzwerk standardmäßig alle Ports öffnen, kannst Du auf den Service-Container über den Standard-Redis-Port 6379 zugreifen.\n\n## Jobs direkt auf der Runner-Maschine ausführen\n\nWenn Du einen Job direkt auf der Runner-Maschine ausführst, musst Du die Ports des Service-Containers den Ports des Docker-Hosts zuordnen. Du kannst vom Docker-Host aus auf Dienstcontainer zugreifen, indem du `localhost` und die Portnummer des Docker-Hosts verwendest.\n\nDu kannst diese Workflowdatei in das `.github/workflows`-Verzeichnis deines Repositorys kopieren und nach Bedarf ändern.\n\n```yaml copy\nname: Redis runner example\non: push\n\njobs:\n  # Label of the runner job\n  runner-job:\n    # You must use a Linux environment when using service containers or container jobs\n    runs-on: ubuntu-latest\n\n    # Service containers to run with `runner-job`\n    services:\n      # Label used to access the service container\n      redis:\n        # Docker Hub image\n        image: redis\n        # Set health checks to wait until redis has started\n        options: >-\n          --health-cmd \"redis-cli ping\"\n          --health-interval 10s\n          --health-timeout 5s\n          --health-retries 5\n        ports:\n          # Maps port 6379 on service container to the host\n          - 6379:6379\n\n    steps:\n      # Downloads a copy of the code in your repository before running CI tests\n      - name: Check out repository code\n        uses: actions/checkout@v6\n\n      # Performs a clean installation of all dependencies in the `package.json` file\n      # For more information, see https://docs.npmjs.com/cli/ci.html\n      - name: Install dependencies\n        run: npm ci\n\n      - name: Connect to Redis\n        # Runs a script that creates a Redis client, populates\n        # the client with data, and retrieves data\n        run: node client.js\n        # Environment variable used by the `client.js` script to create\n        # a new Redis client.\n        env:\n          # The hostname used to communicate with the Redis service container\n          REDIS_HOST: localhost\n          # The default Redis port\n          REDIS_PORT: 6379\n```\n\n### Runner-Job konfigurieren\n\nIm Beispiel wird der  GitHub-gehostete Runner `ubuntu-latest` als Docker-Host verwendet.\n\nDer Workflow konfiguriert einen Dienstcontainer mit der Bezeichnung `redis`. Alle Dienste müssen in einem Container ausgeführt werden, daher erfordert jeder Dienst die Angabe des Containers `image`. Dieses Beispiel verwendet das `redis`-Containerimage und enthält Optionen für Integritätsüberprüfungen, um die Ausführung des Diensts sicherzustellen. Füge dem Imagenamen ein Tag an, um eine Version anzugeben, z. B. `redis:6`. Weitere Informationen findest du im [Redis-Image](https://hub.docker.com/_/redis) für Docker Hub.\n\nDer Workflow ordnet Port 6379 des Redis-Service-Containers dem Docker-Host zu. Weitere Informationen zum Schlüsselwort `ports` findest du unter [Kommunizieren mit Docker-Dienstcontainern](/de/actions/tutorials/use-containerized-services/use-docker-service-containers#mapping-docker-host-and-service-container-ports).\n\n```yaml copy\njobs:\n  # Label of the runner job\n  runner-job:\n    # You must use a Linux environment when using service containers or container jobs\n    runs-on: ubuntu-latest\n\n    # Service containers to run with `runner-job`\n    services:\n      # Label used to access the service container\n      redis:\n        # Docker Hub image\n        image: redis\n        # Set health checks to wait until redis has started\n        options: >-\n          --health-cmd \"redis-cli ping\"\n          --health-interval 10s\n          --health-timeout 5s\n          --health-retries 5\n        ports:\n          # Maps port 6379 on service container to the host\n          - 6379:6379\n```\n\n### Konfigurieren der Schritte für den Runner-Job\n\nDer Workflow führt die folgenden Schritte aus:\n\n1. Auschecken des Repository auf dem Läufer\n2. Installieren von Abhängigkeiten\n3. Ausführen eines Script, um einen Client zu erstellen\n\n```yaml copy\nsteps:\n  # Downloads a copy of the code in your repository before running CI tests\n  - name: Check out repository code\n    uses: actions/checkout@v6\n\n  # Performs a clean installation of all dependencies in the `package.json` file\n  # For more information, see https://docs.npmjs.com/cli/ci.html\n  - name: Install dependencies\n    run: npm ci\n\n  - name: Connect to Redis\n    # Runs a script that creates a Redis client, populates\n    # the client with data, and retrieves data\n    run: node client.js\n    # Environment variable used by the `client.js` script to create\n    # a new Redis client.\n    env:\n      # The hostname used to communicate with the Redis service container\n      REDIS_HOST: localhost\n      # The default Redis port\n      REDIS_PORT: 6379\n```\n\nDas *client.js*-Skript sucht nach den Umgebungsvariablen `REDIS_HOST` und `REDIS_PORT`, um den Client zu erstellen. Der Workflow legt diese beiden Umgebungsvariablen im Rahmen des Schritts „Mit Redis verbinden“ fest, um sie dem *client.js*-Skript zur Verfügung zu stellen. Weitere Informationen zum Skript findest du unter [Testen des Redis-Dienstcontainers](#testing-the-redis-service-container).\n\nDer Hostname ist `localhost` oder `127.0.0.1`.\n\n## Redis-Service-Container testen\n\nDu kannst Deinen Workflow mit dem folgenden Skript testen, das einen Redis-Client erstellt und den Client mit Platzhalter-Daten füllt. Das Skript gibt dann die im Redis-Client gespeicherten Werte auf dem Terminal aus. Für das Skript kann eine beliebige Sprache verwendet werden. In diesem Beispiel werden jedoch Node.js und das npm-Modul `redis` genutzt. Weitere Informationen findest du unter dem [npm-Modul „redis“](https://www.npmjs.com/package/redis).\n\nDu kannst *client.js* anpassen, um alle Redis-Vorgänge einzuschließen, die für deinen Workflow erforderlich sind. In diesem Beispiel erstellt das Skript die Redis-Client-Instanz, fügt Platzhalter-Daten hinzu und ruft dann die Daten ab.\n\nFüge deinem Repository eine neue Datei namens *client.js* mit dem folgenden Code hinzu.\n\n```javascript copy\nconst redis = require(\"redis\");\n\n// Creates a new Redis client\n// If REDIS_HOST is not set, the default host is localhost\n// If REDIS_PORT is not set, the default port is 6379\nconst redisClient = redis.createClient({\n  url: `redis://${process.env.REDIS_HOST}:${process.env.REDIS_PORT}`\n});\n\nredisClient.on(\"error\", (err) => console.log(\"Error\", err));\n\n(async () => {\n  await redisClient.connect();\n\n  // Sets the key \"octocat\" to a value of \"Mona the octocat\"\n  const setKeyReply = await redisClient.set(\"octocat\", \"Mona the Octocat\");\n  console.log(\"Reply: \" + setKeyReply);\n  // Sets a key to \"species\", field to \"octocat\", and \"value\" to \"Cat and Octopus\"\n  const SetFieldOctocatReply = await redisClient.hSet(\"species\", \"octocat\", \"Cat and Octopus\");\n  console.log(\"Reply: \" + SetFieldOctocatReply);\n  // Sets a key to \"species\", field to \"dinotocat\", and \"value\" to \"Dinosaur and Octopus\"\n  const SetFieldDinotocatReply = await redisClient.hSet(\"species\", \"dinotocat\", \"Dinosaur and Octopus\");\n  console.log(\"Reply: \" + SetFieldDinotocatReply);\n  // Sets a key to \"species\", field to \"robotocat\", and \"value\" to \"Cat and Robot\"\n  const SetFieldRobotocatReply = await redisClient.hSet(\"species\", \"robotocat\", \"Cat and Robot\");\n  console.log(\"Reply: \" + SetFieldRobotocatReply);\n\n  try {\n    // Gets all fields in \"species\" key\n    const replies = await redisClient.hKeys(\"species\");\n    console.log(replies.length + \" replies:\");\n    replies.forEach((reply, i) => {\n        console.log(\"    \" + i + \": \" + reply);\n    });\n    await redisClient.quit();\n  }\n  catch (err) {\n    // statements to handle any exceptions\n  }\n})();\n```\n\nDas Skript erstellt einen neuen Redis-Client mithilfe der Methode `createClient`. Diese Methode akzeptiert einen Parameter vom Typ `host` und einen Parameter vom Typ `port`. Im Skript werden die Umgebungsvariablen `REDIS_HOST` und `REDIS_PORT` verwendet, um die IP-Adresse und den Port des Clients festzulegen. Wenn `host` und `port` nicht definiert sind, werden der Standardhost `localhost` und der Standardport 6379 verwendet.\n\nIm Skript werden die Methoden `set` und `hset` verwendet, um die Datenbank mit einigen Schlüsseln, Feldern und Werten aufzufüllen. Um zu bestätigen, dass der Redis-Client die Daten enthält, gibt das Skript den Inhalt der Datenbank in das Konsolen-Log aus.\n\nWenn Du diesen Workflow ausführst, solltest Du im Schritt „Mit Redis verbinden“ die folgende Ausgabe sehen, welche zeigt, dass Du den Redis-Client erstellt und Daten hinzugefügt hast:\n\n```shell\nReply: OK\nReply: 1\nReply: 1\nReply: 1\n3 replies:\n    0: octocat\n    1: dinotocat\n    2: robotocat\n```"}