yandex-cloud / nodejs-sdk

Yandex.Cloud NodeJS SDK

Geek Repo:Geek Repo

Github PK Tool:Github PK Tool

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,
    };
  }
};