Yandex Cloud
Поиск
Связаться с намиПодключиться
  • Документация
  • Блог
  • Все сервисы
  • Статус работы сервисов
    • Популярные
    • Инфраструктура и сеть
    • Платформа данных
    • Контейнеры
    • Инструменты разработчика
    • Бессерверные вычисления
    • Безопасность
    • Мониторинг и управление ресурсами
    • Машинное обучение
    • Бизнес-инструменты
  • Все решения
    • По отраслям
    • По типу задач
    • Экономика платформы
    • Безопасность
    • Техническая поддержка
    • Каталог партнёров
    • Обучение и сертификация
    • Облако для стартапов
    • Облако для крупного бизнеса
    • Центр технологий для общества
    • Облако для интеграторов
    • Поддержка IT-бизнеса
    • Облако для фрилансеров
    • Обучение и сертификация
    • Блог
    • Документация
    • Контент-программа
    • Мероприятия и вебинары
    • Контакты, чаты и сообщества
    • Идеи
    • Истории успеха
    • Тарифы Yandex Cloud
    • Промоакции и free tier
    • Правила тарификации
  • Документация
  • Блог
Проект Яндекса
© 2025 ООО «Яндекс.Облако»
Yandex Container Registry
  • Начало работы
  • Yandex Container Solution
  • Управление доступом
  • Правила тарификации
  • Справочник Terraform
  • Метрики Monitoring
  • Аудитные логи Audit Trails
  • Решение проблем
  • Вопросы и ответы
  • Обучающие курсы

В этой статье:

  • Перед началом работы
  • Необходимые платные ресурсы
  • Подготовьте окружение
  • Создайте функцию
  • Создайте триггер
  • Загрузите Docker-образ
  • Проверьте результат
  • Как удалить созданные ресурсы

Автоматическое сканирование Docker-образа при загрузке с помощью консоли управления, CLI и API

Статья создана
Yandex Cloud
Обновлена 21 апреля 2025 г.
  • Перед началом работы
    • Необходимые платные ресурсы
  • Подготовьте окружение
  • Создайте функцию
  • Создайте триггер
  • Загрузите Docker-образ
  • Проверьте результат
  • Как удалить созданные ресурсы

Примечание

Автоматическое сканирование Docker-образов на наличие уязвимостей при загрузке в Yandex Container Registry можно включить в настройках сканера уязвимостей без создания функций и триггеров Yandex Cloud Functions.

Чтобы настроить автоматическое сканирование Docker-образов на наличие уязвимостей при загрузке в Yandex Container Registry, выполните следующие шаги:

  1. Подготовьте облако к работе.
  2. Подготовьте окружение.
  3. Создайте функцию.
  4. Создайте триггер.
  5. Загрузите Docker-образ.
  6. Проверьте результат.

Если созданные ресурсы вам больше не нужны, удалите их.

Перед началом работыПеред началом работы

Зарегистрируйтесь в Yandex Cloud и создайте платежный аккаунт:

  1. Перейдите в консоль управления, затем войдите в Yandex Cloud или зарегистрируйтесь.
  2. На странице Yandex Cloud Billing убедитесь, что у вас подключен платежный аккаунт, и он находится в статусе ACTIVE или TRIAL_ACTIVE. Если платежного аккаунта нет, создайте его и привяжите к нему облако.

Если у вас есть активный платежный аккаунт, вы можете создать или выбрать каталог, в котором будет работать ваша инфраструктура, на странице облака.

Подробнее об облаках и каталогах.

Необходимые платные ресурсыНеобходимые платные ресурсы

В стоимость поддержки инфраструктуры входят:

  • плата за хранение Docker-образа в реестре, сканер уязвимостей и исходящий трафик (см. тарифы Yandex Container Registry);
  • плата за вызовы функций (см. тарифы Yandex Cloud Functions).

Подготовьте окружениеПодготовьте окружение

Если у вас еще нет интерфейса командной строки Yandex Cloud (CLI), установите и инициализируйте его.

  1. Установите и настройте Docker.

  2. Создайте реестр для загрузки Docker-образа.

    Консоль управления
    CLI
    API
    1. В консоли управления выберите каталог, в котором будет создан реестр.
    2. В списке сервисов выберите Container Registry.
    3. Нажмите кнопку Создать реестр.
    4. Задайте имя реестра.
    5. Нажмите кнопку Создать реестр.

    Выполните команду:

    yc container registry create --name my-reg
    

    Результат:

    done
    id: crpd50616s9a********
    folder_id: b1g88tflru0e********
    name: my-reg
    status: ACTIVE
    created_at: "2019-01-09T14:34:06.601Z"
    

    Воспользуйтесь методом create для ресурса Registry.

  3. Создайте сервисный аккаунт с именем scanner и назначьте ему роль container-registry.images.scanner на каталог, в котором создали реестр.

    Консоль управления
    CLI
    API
    1. В консоли управления выберите каталог, в котором вы хотите создать сервисный аккаунт.
    2. В верхней части экрана перейдите на вкладку Сервисные аккаунты.
    3. Нажмите кнопку Создать сервисный аккаунт.
    4. Введите имя сервисного аккаунта.
    5. Нажмите Добавить роль и выберите роль container-registry.images.scanner.
    6. Нажмите кнопку Создать.
    1. Создайте сервисный аккаунт:

      yc iam service-account create --name service-acc
      

      Результат:

      id: ajelabcde12f********
      folder_id: b0g12ga82bcv********
      created_at: "2021-05-17T14:32:18.900092Z"
      name: service-acc
      
    2. Назначьте роль сервисному аккаунту:

      yc resource-manager folder add-access-binding <идентификатор_каталога> \
        --role container-registry.images.scanner \
        --subject serviceAccount:<идентификатор_сервисного_аккаунта>
      

    Воспользуйтесь методами create для ресурса ServiceAccount и updateAccessBindings для ресурса Folder.

  4. Аналогичным способом создайте сервисный аккаунт с именем invoker и назначьте ему роль functions.functionInvoker на каталог, в котором создали реестр.

Создайте функциюСоздайте функцию

Создайте функцию в сервисе Cloud Functions с именем scan-on-push, которая будет запускать сканирование Docker-образа:

Консоль управления
CLI
API
  1. В консоли управления перейдите в каталог, в котором хотите создать функцию.
  2. Выберите сервис Cloud Functions.
  3. Нажмите кнопку Создать функцию.
  4. Введите имя scan-on-push и описание функции.
  5. Нажмите кнопку Создать.
  6. Перейдите в раздел Редактор и создайте версию функции:
    1. В блоке Код функции:
      • Выберите среду исполнения Bash и нажмите Продолжить.

      • Выберите способ редактирования функции Редактор кода.

      • В окне для редактирования функции нажмите Создать файл. В открывшемся окне введите имя файла handler.sh и нажмите Создать.

      • Скопируйте в файл handler.sh следующий код:

        DATA=$(cat | jq -sr '.[0].messages[0].details')
        ID=$(echo $DATA | jq -r '.image_id')
        NAME=$(echo $DATA | jq -r '.repository_name')
        TAG=$(echo $DATA | jq -r '.tag')
        yc container image scan --id ${ID} --async 1>&2
        
      • Укажите точку входа — handler.sh.

    2. В блоке Параметры укажите:
      • Таймаут – 60.
      • Память – 128 МБ.
      • Сервисный аккаунт – scanner.
    3. Нажмите кнопку Сохранить изменения.
  1. Создайте функцию с именем scan-on-push:

    yc serverless function create --name=scan-on-push
    

    Результат:

    id: d4ejb1799eko********
    folder_id: aoek49ghmknn********
    created_at: "2021-17-05T14:07:32.134Z"
    name: scan-on-push
    log_group_id: eolm8aoq9vcp********
    http_invoke_url: https://functions.yandexcloud.net/d4ejb1799eko********
    status: ACTIVE
    
  2. Создайте файл handler.sh и скопируйте в него следующий код:

    DATA=$(cat | jq -sr '.[0].messages[0].details')
    ID=$(echo $DATA | jq -r '.image_id')
    NAME=$(echo $DATA | jq -r '.repository_name')
    TAG=$(echo $DATA | jq -r '.tag')
    yc container image scan --id ${ID} --async 1>&2
    
  3. Создайте версию функции scan-on-push:

    yc serverless function version create \
      --function-name=scan-on-push \
      --runtime bash \
      --entrypoint handler.sh \
      --memory 128m \
      --execution-timeout 60s \
      --source-path handler.sh \
      --service-account-id <идентификатор_сервисного_аккаунта>
    

    Где:

    • --function-name — имя функции, версию которой вы хотите создать.
    • --runtime — среда выполнения.
    • --entrypoint — точка входа, указывается в формате <имя_файла_с_функцией>.<имя_обработчика>.
    • --memory — объем RAM.
    • --execution-timeout — максимальное время выполнения функции до таймаута.
    • --source-path — файл с кодом функции.
    • --service-account-id — идентификатор сервисного аккаунта.

    Результат:

    done (1s)
    id: d4egi3pmsd1q********
    function_id: d4e275oj7jtp********
    ...
    tags:
    - $latest
    log_group_id: ckg6nb0c7uf1********
    

Воспользуйтесь методами create и createVersion для ресурса Function.

Создайте триггерСоздайте триггер

Создайте триггер, который будет вызывать вашу функцию при создании тега Docker-образа.

Консоль управления
CLI
API
  1. В консоли управления перейдите в каталог, в котором хотите создать триггер.
  2. Выберите сервис Cloud Functions.
  3. Перейдите на вкладку Триггеры.
  4. Нажмите кнопку Создать триггер.
  5. В блоке Базовые параметры:
    • Введите имя и описание триггера.
    • В поле Тип выберите Container Registry.
  6. В блоке Настройки Container Registry:
    • В поле Реестр выберите реестр, в который будете загружать Docker-образ.
    • В поле Типы событий выберите событие Создание тега Docker-образа.
  7. В блоке Настройки функции:
    • Выберите функцию scan-on-push.
    • Укажите тег версии функции $latest.
    • Укажите сервисный аккаунт invoker, от имени которого будет вызываться функция.
  8. Нажмите кнопку Создать триггер.

Чтобы создать триггер, выполните команду:

yc serverless trigger create container-registry \
  --name <имя_триггера> \
  --registry-id <идентификатор_реестра> \
  --events 'create-image-tag' \
  --invoke-function-id <идентификатор_функции> \
  --invoke-function-service-account-id <идентификатор_сервисного_аккаунта>

Где:

  • --name — имя триггера.
  • --registry-id — идентификатор реестра, в который будете загружать Docker-образ.
  • --events — события, после наступления которых триггер запускается.
  • --invoke-function-id — идентификатор функции.
  • --invoke-function-service-account-id — идентификатор сервисного аккаунта с правами на вызов функции.

Результат:

id: a1spt834cjmk********
folder_id: b1g86q4m5vej********
created_at: "2021-05-18T20:42:54.898949653Z"
...
      function_tag: $latest
      service_account_id: aje1insoe23e********
status: ACTIVE

Воспользуйтесь методом create для ресурса Trigger.

Загрузите Docker-образЗагрузите Docker-образ

  1. Запустите Docker Desktop.

  2. Аутентифицируйтесь в реестре от своего имени с помощью:

    Docker Credential helper
    OAuth-токена
    IAM-токена
    1. Сконфигурируйте Docker для использования docker-credential-yc:

      yc container registry configure-docker
      

      Результат:

      Credential helper is configured in '/home/<user>/.docker/config.json'
      

      Настройки сохраняются в профиле текущего пользователя.

      Важно

      Credential helper работает только при использовании Docker без sudo. О том, как настроить запуск Docker от имени текущего пользователя без использования sudo читайте в официальной документации Docker.

    2. Проверьте, что Docker сконфигурирован.

      В конфигурационном файле /home/<user>/.docker/config.json должна появиться строка:

      "cr.yandex": "yc"
      
    3. Docker готов к использованию, например, для загрузки Docker-образов. При этом выполнять команду docker login не надо.

    1. Если у вас еще нет OAuth-токена, получите его по ссылке.

    2. Выполните команду:

      echo <OAuth-токен> | docker login --username oauth --password-stdin cr.yandex
      

      Результат:

      Login Succeeded
      

    Примечание

    У IAM-токена короткое время жизни — не более 12 часов. Поэтому такой способ подойдет для приложений, которые будут запрашивать IAM-токен автоматически.

    1. Получите IAM-токен.

    2. Выполните команду:

      yc iam create-token | docker login --username iam --password-stdin cr.yandex
      

      Результат:

      Login Succeeded
      
  3. Скачайте Docker-образ с Docker Hub:

    docker pull ubuntu:20.04
    

    Результат:

    20.04: Pulling from library/ubuntu
    Digest: sha256:cf31af331f38d1d7158470e095b132acd126a7180a54f263d386da88********
    Status: Image is up to date for ubuntu:20.04
    docker.io/library/ubuntu:20.04
    
  4. Присвойте тег Docker-образу:

    docker tag ubuntu:20.04 cr.yandex/<идентификатор_реестра>/ubuntu:20.04
    
  5. Загрузите Docker-образ в Container Registry:

    docker push cr.yandex/<идентификатор_реестра>/ubuntu:20.04
    

    Результат:

    The push refers to repository [cr.yandex/crpu20rpdc2f********/ubuntu]
    2f140462f3bc: Layer already exists
    63c99163f472: Layer already exists
    ccdbb80308cc: Layer already exists
    20.04: digest: sha256:86ac87f73641c920fb42cc9612d4fb57b5626b56ea2a19b894d0673f******** size: 943
    

Проверьте результатПроверьте результат

  1. Просмотрите логи функции scan-on-push и убедитесь, что она выполнилась.

    Консоль управления
    CLI
    1. В консоли управления выберите сервис Cloud Functions.
    2. Перейдите в раздел Функции и выберите функцию scan-on-push.
    3. В открывшемся окне перейдите в раздел Логи и укажите период. По умолчанию задан период за 1 час.

    Чтобы узнать имя или уникальный идентификатор функции, получите список функций в каталоге.

    Посмотрите журнал выполнения функции:

    yc serverless function logs scan-on-push
    

    Результат:

    2021-05-18 09:27:43  START RequestID: 34dc9533-ed6e-4468-b9f2-2aa0******** Version: b09i2s85a0c1********
    2021-05-18 09:27:43  END RequestID: 34dc9533-ed6e-4468-b9f2-2aa0********
    2021-05-18 09:27:43  REPORT RequestID: 34dc9533-ed6e-4468-b9f2-2aa0******** Duration: 538.610 ms Billed Duration: 538.700 ms Memory Size: 128 MB Max Memory Used: 13 MB
    2021-05-18 09:29:25  START RequestID: 5b6a3779-dcc8-44ec-8ee2-2e7f******** Version: b09i2s85a0c1********
    2021-05-18 09:29:26  END RequestID: 5b6a3779-dcc8-44ec-8ee2-2e7f********
    2021-05-18 09:29:26  REPORT RequestID: 5b6a3779-dcc8-44ec-8ee2-2e7f******** Duration: 554.904 ms Billed Duration: 555.000 ms Memory Size: 128 MB Max Memory Used: 13 MB
    ...
    
  2. Проверьте, что при загрузке Docker-образа запустилось новое сканирование.

    Консоль управления
    CLI
    1. В консоли управления выберите каталог, которому принадлежит реестр, содержащий Docker-образ.
    2. Выберите сервис Container Registry.
    3. Выберите реестр, в который загрузили Docker-образ.
    4. Откройте репозиторий, в котором находится Docker-образ.
    5. Выберите нужный Docker-образ и проверьте значение параметра Дата последнего сканирования.

    Чтобы посмотреть запуски сканирования по Docker-образу, выполните команду:

    yc container image list-scan-results --repository-name=<идентификатор_реестра>/<имя_Docker-образа>
    

    Результат:

    +----------------------+----------------------+---------------------+--------+--------------------------------+
    |          ID          |        IMAGE         |     SCANNED AT      | STATUS |        VULNERABILITIES         |
    +----------------------+----------------------+---------------------+--------+--------------------------------+
    | crpu20rpdc2f******** | crpqmsqp5mtb******** | 2021-05-18 14:34:02 | READY  | medium:6, low:13, negligible:3 |
    +----------------------+----------------------+---------------------+--------+--------------------------------+
    

Как удалить созданные ресурсыКак удалить созданные ресурсы

Чтобы перестать платить за созданные ресурсы:

  1. Удалите Docker-образ, который хранится в Yandex Container Solution и реестр.
  2. Удалите функцию Cloud Functions.
  3. Удалите триггер Cloud Functions.

См. такжеСм. также

  • Автоматическое сканирование Docker-образа при загрузке с помощью Terraform

Была ли статья полезна?

Проект Яндекса
© 2025 ООО «Яндекс.Облако»