@wonderingpeanut

Яндекс.Облако: Как настроить автоматическое обновления изображения в Optimized Container Image при обновлении изображения в Container Registry?

Приветствую.

Есть докер контейнер, который размещен в Yandex Container Registry. Это контейнер развернут в Yandex Compute на базе Optimized Container Image. Когда я обновляю контейнер и пушу новую версию в Container Registry, Optimized Container Image не обновляет изображение автоматически, т.е. остается развернутым старая версия приложения.

Существует ли в яндексе автоматическое обновления изображения? Как его включить?
  • Вопрос задан
  • 297 просмотров
Решения вопроса 1
@wonderingpeanut Автор вопроса
Для автоматического обновления ОБРАЗА в ВМ нужно создать облачную функцию, в которой будет триггер, который срабатывает при обновлении тега образа в регистре контейнеров.
Содержимое функции примерно такое (node.js 14):
const { Session } = require("yandex-cloud");
const { InstanceService } = require("yandex-cloud/api/compute/v1");
const { ImageService } = require("yandex-cloud/api/containerregistry/v1");

const folderId = "айди каталога";
const instanceId = "айди инстанса (вм)";

module.exports.handler = async function (event, context) {
  // создаем сессию из IAM токена и инстансы сервисов
  const session = new Session(context.token.access_token);
  const instanceService = new InstanceService(session);
  const imageService = new ImageService(session);
  // получаем метадату обновляемого инстанса и список всех изображений в каталоге
  const { metadata } = await instanceService.get({ instanceId, view: 1 });
  const { images } = await imageService.list({ folderId });
  // находим самое новое изображение и предыдущее
  const latestImage = images[0];
  const previousImage = images[1];
  // обновляем контейнер в метадате
  const latestContainerName = "cr.yandex/" + latestImage.name + ":" + latestImage.tags[0];
  const previousContainerName = "cr.yandex/" + previousImage.name + ":" + previousImage.tags[0];
  const containerMetadata = metadata["docker-container-declaration"].replace(previousContainerName, latestContainerName)
  try {
    // обновляем ВМ
    const response = await instanceService.updateMetadata({
      instanceId,
      upsert: { "docker-container-declaration": containerMetadata  },
    });
    return {
      metadata,
      response,
      status: 1,
    };
  } catch (err) {
    return {
      err,
      status: 0,
    };
  }
};
Ответ написан
Комментировать
Пригласить эксперта
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы