Для автоматического обновления ОБРАЗА в ВМ нужно создать облачную функцию, в которой будет триггер, который срабатывает при обновлении тега образа в регистре контейнеров.
Содержимое функции примерно такое (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,
};
}
};