Skip to main content

Сведения о контейнерах служб

Контейнеры служб можно использовать для подключения баз данных, веб-служб, кэшей памяти и других инструментов к рабочему процессу.

Сведения о контейнерах служб

Контейнеры служб представляют собой контейнеры Docker, которые предоставляют простой портативный способ размещения служб, которые вам могут потребоваться для тестирования или эксплуатации приложения в рабочем процессе. Например, рабочему процессу может потребоваться выполнить тесты интеграции, требующие доступа к базе данных и кэшу памяти.

Контейнеры служб можно настроить для каждого задания в рабочем процессе. GitHub создает новый контейнер Docker для каждой службы, настроенной в рабочем процессе, и уничтожает контейнер службы после завершения задания. Действия в задании могут взаимодействовать со всеми контейнерами служб, которые включены в одно задание. Однако нельзя создавать и использовать контейнеры служб в рамках составного действия.

Примечание. Если в рабочих процессах используются действия контейнеров Docker, контейнеров заданий или контейнеров служб, необходимо применять средство выполнения Linux:

  • При использовании размещенных в GitHub средств выполнения необходимо применять средство выполнения Ubuntu.
  • Если вы применяете локальные средства выполнения, необходимо использовать компьютер Linux в качестве средства выполнения, а Docker нужно установить.

Взаимодействие с контейнерами служб

Задания в рабочем процессе можно настроить для выполнения непосредственно на компьютере средства выполнения тестов или в контейнере Docker. Обмен данными между заданием и его контейнерами служб может варьироваться в зависимости от того, выполняется ли задание непосредственно на компьютере средства выполнения тестов или в контейнере.

Выполнение заданий в контейнере

При выполнении заданий в контейнере GitHub подключает контейнеры служб к заданию с помощью определяемых пользователем сетей моста Docker. Дополнительные сведения см. в разделе "Сетевой драйвер Bridge" в документации по Docker.

Выполнение задания и служб в контейнере упрощает сетевой доступ. Вы можете получить доступ к контейнеру службы с помощью метки, настроенной в рабочем процессе. Имя узла контейнера службы автоматически сопоставляется с именем метки. Например, если вы создаете контейнер службы с меткой redis, имя узла контейнера службы будет redis.

Вам не потребуется настраивать порты для контейнеров служб. По умолчанию все контейнеры, которые являются частью одной сети Docker, предоставляют все порты друг другу, однако порты не предоставляются за пределами сети Docker.

Выполнение заданий на компьютере средства выполнения тестов

При выполнении заданий непосредственно на компьютере средства выполнения тестов можно получить доступ к контейнерам служб с помощью localhost:<port> или 127.0.0.1:<port>. GitHub настраивает сеть контейнеров для включения связи между контейнером службы и узлом Docker.

Когда задание выполняется непосредственно на компьютере средства выполнения тестов, служба, запущенная в контейнере Docker, по умолчанию не предоставляет свои порты заданию в средстве выполнения тестов. Необходимо сопоставить порты в контейнере службы с узлом Docker. Дополнительные сведения см. в разделе Сведения о контейнерах служб.

Создание контейнеров служб

Ключевое слово services можно использовать для создания контейнеров служб, которые являются частью задания в рабочем процессе. Дополнительные сведения см. в разделе jobs.<job_id>.services.

В этом примере создается служба, вызываемая redis в задании, вызываемом container-job. В этом примере узел Docker является контейнером node:16-bullseye.

YAML
name: Redis container example
on: push

jobs:
  # Label of the container job
  container-job:
    # Containers must run in Linux based operating systems
    runs-on: ubuntu-latest
    # Docker Hub image that `container-job` executes in
    container: node:16-bullseye

    # Service containers to run with `container-job`
    services:
      # Label used to access the service container
      redis:
        # Docker Hub image
        image: redis

Сопоставление портов узла Docker и контейнеров служб

Если задание выполняется в контейнере Docker, не требуется сопоставлять порты на узле или в контейнере службы. Если задание выполняется непосредственно на компьютере средства выполнения тестов, необходимо сопоставить все необходимые порты контейнера службы с портами на хост-компьютере средства выполнения тестов.

Вы можете сопоставить порты контейнеров служб с узлом Docker с помощью ключевого слова ports. Дополнительные сведения см. в разделе jobs.<job_id>.services.

Значение параметра portsDescription
8080:80Сопоставляет TCP-порт 80 в контейнере с портом 8080 на узле Docker.
8080:80/udpСопоставляет UDP-порт 80 в контейнере с портом 8080 на узле Docker.
8080/udpСопоставляет случайный выбранный порт на узле Docker с портом UDP 8080 в контейнере.

При сопоставлении портов с помощью ключевого слова ports GitHub использует команду --publish для публикации портов контейнера на узле Docker. Дополнительные сведения см. в разделе Сеть контейнеров Docker в документации по Docker.

Если указать порт контейнера, но не порт узла Docker, порт контейнера случайным образом назначается свободному порту. GitHub задает назначенный порт контейнера в контексте контейнера службы. Например, если для контейнера службы redis настроен порт узла Docker 5432, можно получить доступ к соответствующему порту контейнера с помощью контекста job.services.redis.ports[5432]. Дополнительные сведения см. в разделе Доступ к контекстной информации о запусках рабочих процессов.

Пример сопоставления портов Redis

В этом примере порт контейнера службы redis 6379 сопоставляется с портом узла Docker 6379.

YAML
name: Redis Service Example
on: push

jobs:
  # Label of the container job
  runner-job:
    # You must use a Linux environment when using service containers or container jobs
    runs-on: ubuntu-latest

    # Service containers to run with `runner-job`
    services:
      # Label used to access the service container
      redis:
        # Docker Hub image
        image: redis
        #
        ports:
          # Opens tcp port 6379 on the host and service container
          - 6379:6379

Проверка подлинности с помощью реестров образов

Вы можете указать учетные данные для контейнеров служб, если необходимо пройти проверку подлинности в реестре образов. Это позволяет использовать образы из частных реестров или увеличить ограничение скорости DockerHub.

Ниже приведен пример проверки подлинности с помощью Docker Hub и GitHub Container registry:

YAML
jobs:
  build:
    services:
      redis:
        # Docker Hub image
        image: redis
        ports:
          - 6379:6379
        credentials:
          username: ${{ secrets.dockerhub_username }}
          password: ${{ secrets.dockerhub_password }}
      db:
        # Private registry image
        image:  ghcr.io/octocat/testdb:latest
        credentials:
          username: ${{ github.repository_owner }}
          password: ${{ secrets.ghcr_password }}

Дополнительные материалы