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

Используйте контейнер для выполнения шагов задания.

## Обзор

Используйте `jobs.<job_id>.container` для создания контейнера для выполнения всех этапов задания, для которых еще не указан контейнер. При наличии этапов, которые используют действия скрипта и контейнера, действия контейнера будут выполняться как одноуровневые контейнеры в той же сети с теми же подключениями томов.

Если `container` не задан, все этапы будут выполняться непосредственно на узле, указанном, `runs-on`, если только этап не относится к действию, настроенному на выполнение в контейнере.

> \[!NOTE]
> Оболочка по умолчанию для `run` шагов внутри контейнера `sh` вместо `bash`. Это значение может быть изменено на [`jobs.<job_id>.defaults.run`](/ru/actions/reference/workflows-and-actions/workflow-syntax#jobsjob_iddefaultsrun) или [`jobs.<job_id>.steps[*].shell`](/ru/actions/reference/workflows-and-actions/workflow-syntax#jobsjob_idstepsshell).

### Пример. Выполнение задания в контейнере

```yaml copy
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)
```

При указании только образа контейнера можно опустить ключевое слово `image`.

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

### Инструкции и переопределения Dockerfile

Dockerfile содержит инструкции и аргументы, определяющие содержимое и поведение запуска контейнера Docker. Дополнительные сведения об инструкциях, поддерживаемых Docker, см [. в справочнике](https://docs.docker.com/engine/reference/builder/) по Dockerfile в документации по Docker.

Некоторые инструкции Docker взаимодействуют, GitHub Actionsи файл метаданных действия может переопределить некоторые инструкции Docker. Убедитесь, что вы знакомы с тем, как dockerfile взаимодействует с GitHub Actions таким образом, чтобы предотвратить непредвиденное поведение.

Справочные сведения см. в разделе [Поддержка Dockerfile для GitHub Actions](/ru/actions/reference/workflows-and-actions/dockerfile-support).

## Определение образа контейнера

Используйте `jobs.<job_id>.container.image` для определения образа Docker, который будет использоваться в качестве контейнера для выполнения действия. Значением может быть имя образа Docker Hub или имя реестра.

> \[!NOTE]
> Docker Hub обычно накладывает ограничения скорости для операций отправки и извлечения, которые повлияют на задания на локальных запусках. Однако GitHub, размещенные в runner, не подлежат этим ограничениям на основе соглашения между переменными данных.product.github %} и Docker.

## Определение учетных данных для реестра контейнеров

Если реестру контейнеров образа требуется проверка подлинности для извлечения образа, можно использовать `jobs.<job_id>.container.credentials`, чтобы настроить `map` для `username` и `password`. Учетные данные являются теми же значениями, которые будут предоставлены команде [`docker login`](https://docs.docker.com/engine/reference/commandline/login/).

### Пример: определение учетных данных для реестра контейнеров

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

## Использование переменных среды с контейнером

Используйте `jobs.<job_id>.container.env` для задания `map` переменных среды в контейнере.

## Предоставление сетевых портов в контейнере

Используйте `jobs.<job_id>.container.ports` для задания `array` портов для использования в контейнере.

## Подключение томов в контейнере

Используйте `jobs.<job_id>.container.volumes` для задания `array` томов, которые будет использовать контейнер. Тома можно использовать для совместного использования данных между службами или другими этапами в задании. Можно указать именованные тома Docker, анонимные тома Docker или подключения привязок на узле.

Чтобы указать том, укажите путь к источнику и назначению:

`<source>:<destinationPath>`.

`<source>` — это имя тома или абсолютный путь на хост-компьютере, а `<destinationPath>` — это абсолютный путь в контейнере.

### Пример. Подключение томов в контейнере

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

## Настройка параметров ресурса контейнера

Используйте `jobs.<job_id>.container.options` для настройки дополнительных параметров ресурса контейнера Docker. Список параметров см. в разделе [`docker create` параметров](https://docs.docker.com/engine/reference/commandline/create/#options).

> \[!WARNING]
> Параметры `--network` и `--entrypoint` параметры не поддерживаются.