How to update docker image inside VM | Как обновить докер образ в ВМ
b-novikov-ipersonality opened this issue · comments
I'm looking for a way to automatically update docker image inside VM when new release available in Container registry.
I'm going to use Cloud Functions but can't seem to find a method in SDK that would update docker image the VM is using.
Example would be very appreciated.
=============================
Нужно настроить автоматическое обновление образа в докер контейнере, когда новая версия контейнера появляется в регистре.
Собираюсь использовать Cloud Functions, но нигде не могу найти метод, с помощью которого можно было бы обновить докер изображение в ВМ.
Поделитесь, пожалуйста, примером, как это сделать.
Если вы пользуетесь, COI образом то вам достаточно обновить поле metadata у ВМ при помощи этого метода.
Для этого нужно будет обновить ключ в метадате docker-compose
, если контейнеры развернуты при помощи описания docker-compose.yaml.
@nikolaymatrosov спасибо за ответ!
Удалось настроить автообновление контейнера вот таким костылем(?):
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) {
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,
};
}
};