{"meta":{"title":"Redisサービスコンテナの作成","intro":"サービスコンテナを使って、ワークフロー中でRedisのクライアントを作成できます。 このガイドでは、コンテナで実行されるジョブか、ランナーマシン上で直接実行されるジョブのためのRedisサービスの作成例を紹介します。","product":"GitHub Actions","breadcrumbs":[{"href":"/ja/actions","title":"GitHub Actions"},{"href":"/ja/actions/tutorials","title":"チュートリアル"},{"href":"/ja/actions/tutorials/use-containerized-services","title":"コンテナー化されたサービスを使用する"},{"href":"/ja/actions/tutorials/use-containerized-services/create-redis-service-containers","title":"Redis サービス コンテナーを作成する"}],"documentType":"article"},"body":"# Redisサービスコンテナの作成\n\nサービスコンテナを使って、ワークフロー中でRedisのクライアントを作成できます。 このガイドでは、コンテナで実行されるジョブか、ランナーマシン上で直接実行されるジョブのためのRedisサービスの作成例を紹介します。\n\n## はじめに\n\nこのガイドでは、Docker Hub `redis` イメージを使用してサービス コンテナーを構成するワークフローの例を示します。 このワークフローは、Redisのクライアントを作成してクライアントにデータを展開するスクリプトを実行します。 Redisクライアントを作成して展開するワークフローをテストするために、このスクリプトはクライアントのデータをコンソールに出力します。\n\n> \\[!NOTE]\n> ワークフローで Docker コンテナー アクション、ジョブ コンテナー、またはサービス コンテナーが使われる場合は、Linux ランナーを使う必要があります。\n>\n> * GitHubホストランナーを使うなら、Ubuntuランナーを使わなければなりません。\n> * セルフホストランナーを使っているなら、ランナーとしてLinuxマシンを使い、Dockerをインストールしておかなければなりません。\n\n## 前提条件\n\nデータ再利用可能なアクション.サービスコンテナ前提条件 %}\n\nYAML、GitHub Actionsの構文、Redisの基本な理解があれば役立つかも知れません。 詳細については、以下を参照してください:\n\n* [ワークフローの書き込み](/ja/actions/learn-github-actions)\n* [Redis を使い始める](https://redis.io/learn/howtos/quick-start) (Redis ドキュメント)\n\n## コンテナ内でのジョブの実行\n\nジョブをコンテナ内で実行するように設定すれば、ジョブとサービスコンテナ間のネットワーク設定が単純になります。 同じユーザ定義ブリッジネットワーク上にあるDockerコンテナは、すべてのポートを互いに公開するので、サービスコンテナのポートをDockerホストにマップする必要がありません。 ワークフロー中で設定したラベルを使って、ジョブコンテナからサービスコンテナにアクセスできます。\n\nこのワークフロー ファイルをリポジトリの `.github/workflows` ディレクトリにコピーして、必要に応じて修正できます。\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### コンテナジョブの設定\n\nこのワークフローは、`node:20-bookworm-slim` コンテナーで実行されるジョブを構成し、`ubuntu-latest`  GitHub ホステッド ランナーをコンテナーの Docker ホストとして使用するジョブを構成します。 `node:20-bookworm-slim` コンテナーの詳細については、Docker Hub の[ノード イメージ](https://hub.docker.com/_/node)を参照してください。\n\nワークフローは、`redis` ラベルを使用してサービス コンテナーを構成します。 すべてのサービスはコンテナー内で実行しなければならないので、各サービスについてコンテナー `image` を指定する必要があります。 この例は `redis` コンテナー イメージを使用しており、サービスが動作していることを確認するためのヘルス チェック オプションが含まれます。 イメージ名にタグを追加してバージョンを指定します (例: `redis:6`)。 詳細については、Docker Hub の [redis イメージ](https://hub.docker.com/_/redis)を参照してください。\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### コンテナー ジョブの手順の構成\n\nワークフローは以下のステップを実行します。\n\n1. ランナー上にリポジトリをチェックアウト\n2. 依存関係のインストール\n3. クライアントを作成するスクリプトの実行\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\n*client.js* スクリプトは、クライアントを作成するための環境変数 `REDIS_HOST` と `REDIS_PORT` を探します。 ワークフローは、これら 2 つの環境変数を \"Redis に接続する\" ステップの一部として設定し、*client.js* スクリプトから利用できるようにします。 スクリプトの詳細については、「[Redis サービス コンテナーのテスト](#testing-the-redis-service-container)」を参照してください。\n\nRedis サービスのホスト名は、ワークフロー中で設定されたラベルで、ここでは `redis` です。 同じユーザー定義ブリッジネットワーク上のDockerコンテナは、デフォルトですべてのポートをオープンするので、サービスコンテナにはデフォルトのRedisのポートである6379でアクセスできます。\n\n## ランナーマシン上で直接のジョブの実行\n\nランナーマシン上で直接ジョブを実行する場合、サービスコンテナ上のポートをDockerホスト上のポートにマップしなければなりません。 Docker ホストからサービス コンテナーへは、`localhost` と Docker ホストのポート番号を使ってアクセスできます。\n\nこのワークフロー ファイルをリポジトリの `.github/workflows` ディレクトリにコピーして、必要に応じて修正できます。\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### ランナージョブの設定\n\nこの例では、`ubuntu-latest`  GitHub でホストされる ランナーを Docker ホストとして使用します。\n\nワークフローは、`redis` ラベルを使用してサービス コンテナーを構成します。 すべてのサービスはコンテナー内で実行しなければならないので、各サービスについてコンテナー `image` を指定する必要があります。 この例は `redis` コンテナー イメージを使用しており、サービスが動作していることを確認するためのヘルス チェック オプションが含まれます。 イメージ名にタグを追加してバージョンを指定します (例: `redis:6`)。 詳細については、Docker Hub の [redis イメージ](https://hub.docker.com/_/redis)を参照してください。\n\nこのワークフローはRedisサービスコンテナ上のポート6379をDockerホストにマップします。\n`ports` キーワードについて詳しくは、「[Docker サービス コンテナーとの通信](/ja/actions/using-containerized-services/about-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### ランナー ジョブの手順の構成\n\nワークフローは以下のステップを実行します。\n\n1. ランナー上にリポジトリをチェックアウト\n2. 依存関係のインストール\n3. クライアントを作成するスクリプトの実行\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\n*client.js* スクリプトは、クライアントを作成するための環境変数 `REDIS_HOST` と `REDIS_PORT` を探します。 ワークフローは、これら 2 つの環境変数を \"Redis に接続する\" ステップの一部として設定し、*client.js* スクリプトから利用できるようにします。 スクリプトの詳細については、「[Redis サービス コンテナーのテスト](#testing-the-redis-service-container)」を参照してください。\n\nホスト名は、`localhost` または `127.0.0.1` です。\n\n## Redisサービスコンテナのテスト\n\nワークフローを以下のスクリプトでテストできます。このスクリプトはRedisクライアントを作成し、いくつかのプレースホルダーデータをクライアントに展開します。 そしてこのスクリプトは、Redisクライアント内に保存された値をターミナルに出力します。 スクリプトには好きな言語を使えますが、この例では Node.js と npm モジュールの `redis` を使っています。 詳しくは、「[npm redis モジュール](https://www.npmjs.com/package/redis)」を参照してください。\n\n```\n          _client.js_ を修正して、ワークフローで必要な Redis の操作を含めることができます。 この例では、スクリプトはRedisクライアントのインスタンスを作成し、プレースホルダーデータを追加し、そしてそのデータを取り出します。\n```\n\n以下のコードを使用して、リポジトリに *client.js* という名前の新しいファイルを追加してください。\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\nこのスクリプトでは、`createClient` パラメーターと `host` パラメーターを受け取る `port` メソッドを使用して新しい Redis クライアントが作成されます。 このスクリプトでは、クライアントの IP アドレスとポートを設定するために、`REDIS_HOST` 環境変数と `REDIS_PORT` 環境変数が使用されます。\n`host` と `port` が定義されていない場合、既定のホストは `localhost` であり、既定のポートは 6379 です。\n\nこのスクリプトでは、`set` メソッドと `hset` メソッドを使用し、データベースに一部のキー、フィールド、値を入力します。 Redisデータベースがデータを含んでいることを確認するために、スクリプトはデータベースの内容をコンソールログに出力します。\n\nこのワークフローを実行すると、\"Connect to Redis\"ステップで以下のように出力され、Redisのクライアントが作成され、データが追加されたことが確認できます。\n\n```shell\nReply: OK\nReply: 1\nReply: 1\nReply: 1\n3 replies:\n    0: octocat\n    1: dinotocat\n    2: robotocat\n```"}