{"meta":{"title":"Создание контейнеров служб Redis","intro":"Контейнеры служб можно использовать для создания клиента Redis в рабочем процессе. В этом руководстве показаны примеры создания службы Redis для заданий, которые выполняются в контейнерах или непосредственно на компьютере средства выполнения тестов.","product":"GitHub Actions","breadcrumbs":[{"href":"/ru/actions","title":"GitHub Actions"},{"href":"/ru/actions/tutorials","title":"Учебники"},{"href":"/ru/actions/tutorials/use-containerized-services","title":"Использование контейнерных служб"},{"href":"/ru/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Вы должны знать, как контейнеры служб работают с GitHub Actions. Кроме того, вам должны быть известны сетевые различия между выполнением заданий непосредственно в средстве выполнения или в контейнере. Дополнительные сведения см. в разделе [Взаимодействие с контейнерами служб Docker](/ru/actions/using-containerized-services/about-service-containers).\n\nКроме того, вы можете получить общее представление о синтаксисе YAML для GitHub Actions и Redis. Дополнительные сведения см. в разделе:\n\n* [Написание рабочих процессов](/ru/actions/learn-github-actions)\n* [Начало работы с Redis в документации по Redis](https://redis.io/learn/howtos/quick-start)\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` см. в статье об [образе узла](https://hub.docker.com/_/node) в Docker Hub.\n\nРабочий процесс настраивает контейнер службы с меткой `redis`. Все службы должны выполняться в контейнере, поэтому для каждой из них требуется указать `image` контейнера. В этом примере используется образ контейнера `redis` и включены параметры проверки работоспособности, чтобы убедиться, что служба запущена. Добавьте тег к имени изображения, чтобы указать версию, например. `redis:6` Дополнительные сведения см. в разделе [Образ Redis](https://hub.docker.com/_/redis) на 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### Настройка шагов для задания контейнера\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` для создания клиента. Эти две переменные среды задаются на шаге рабочего процесса \"Подключение к Redis\", после чего становятся доступны скрипту *client.js*. Дополнительные сведения о скрипте см. в разделе [\"Тестирование контейнера](#testing-the-redis-service-container) службы Redis\".\n\nИмя узла службы Redis — это метка, настроенная в рабочем процессе; в данном случае — `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` Дополнительные сведения см. в разделе [Образ Redis](https://hub.docker.com/_/redis) на Docker Hub.\n\nРабочий процесс сопоставляет порт 6379 в контейнере службы Redis с узлом Docker. Дополнительные сведения о ключевом слове `ports` см. в разделе [Взаимодействие с контейнерами служб Docker](/ru/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` для создания клиента. Эти две переменные среды задаются на шаге рабочего процесса \"Подключение к Redis\", после чего становятся доступны скрипту *client.js*. Дополнительные сведения о скрипте см. в разделе [\"Тестирование контейнера](#testing-the-redis-service-container) службы Redis\".\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Вы можете изменить *client.js*, чтобы включить все операции Redis, необходимые для вашего рабочего процесса. В этом примере сценарий создает экземпляр клиента Redis, добавляет данные заполнителя, а затем извлекает данные.\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Сценарий создает новый клиент Redis с помощью метода `createClient`, который принимает параметр `host` и `port`. Сценарий использует переменные среды `REDIS_HOST` и `REDIS_PORT` для настройки IP-адреса порта клиента. Если `host` и `port` не определены, по умолчанию используется узел `localhost` и порт 6379.\n\nСценарий использует методы `set` и `hset` для заполнения базы данных ключами, полями и значениями. Чтобы убедиться, что клиент Redis содержит эти данные, сценарий выводит содержимое базы данных в журнал консоли.\n\nПри запуске этого рабочего процесса вы увидите следующие выходные данные на шаге «Подключение к 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```"}