Как работает «последний» тег в определении задачи ECS и при извлечении экземпляров контейнера из ECR? - PullRequest
3 голосов
/ 10 мая 2019

У меня проблемы с использованием тега latest в определении задачи ECR, где параметр image имеет значение типа XXXXXXXXXXXX.dkr.ecr.us-east-1.amazonaws.com/reponame/web:latest.

Я ожидаю, что это определение задачи извлечет образ с тегом latest из ECR, как только новый экземпляр службы (задача) будет запущен на экземпляре контейнера (экземпляр EC2, зарегистрированный в кластере).

Однако в моем случае, когда я подключаюсь к экземпляру контейнера удаленно и выводю список образов докера, я вижу, что он не извлек последний образ релиза из ECR.

В последнем теге за текущей версией находятся две версии выпуска, начиная с тех пор, как я обновил определение задачи, чтобы использовать экземпляр тега latest для явного определения тега версии, т.е. :v1.05.

У меня есть только один экземпляр контейнера в этом кластере.

Возможно, в моем процессе есть какая-то странность, но этот вопрос в основном о том, как этот latest должен вести себя в таком сценарии?

Сборка и тегирование образа моего докера, push ECR, обновление определения задачи ECS и процесс обновления службы ECS:

# Build the image with multiple tags
docker build -t reponame/web:latest -t reponame/web:v1.05 .

# Tag the image with the ECR repo URI
docker tag ${imageId} XXXXXXXXXXXX.dkr.ecr.us-east-1.amazonaws.com/reponame/web

# Push both tags separately
docker push XXXXXXXXXXXX.dkr.ecr.us-east-1.amazonaws.com/reponame/web:v1.05
docker push XXXXXXXXXXXX.dkr.ecr.us-east-1.amazonaws.com/reponame/web:latest

# Run only if the definition file's contents has been updated
aws ecs register-task-definition --cli-input-json file://web-task-definition.json

# Update the service with force-new-deployment
aws ecs update-service \
  --cluster my-cluster-name \
  --service web \
  --task-definition web \
  --force-new-deployment

С файлом определения задачи:

{
  "family": "web",
  "containerDefinitions": [
    {
      "name": "web",
      "image": "XXXXXXXXXXXX.dkr.ecr.us-east-1.amazonaws.com/reponame/web:latest",
      "essential": true,
      "memory": 768,
      "memoryReservation": 512,
      "cpu": 768,
      "portMappings": [
        {
          "containerPort": 5000,
          "hostPort": 80
        }
      ],
      "entryPoint": [
        "yarn", "start"
      ],
      "environment": [
        {
          "name": "HOST",
          "value": "0.0.0.0"
        },
        {
          "name": "NUXT_HOST",
          "value": "0.0.0.0"
        },
        {
          "name": "NUXT_PORT",
          "value": "5000"
        },
        {
          "name": "NODE_ENV",
          "value": "production"
        },
        {
          "name": "API_URL",
          "value": "/api"
        }
      ]
    }
  ]
}

1 Ответ

2 голосов
/ 10 мая 2019

Оказалось, проблема была с моими скриптами. Использовал другую переменную со старым значением, все еще сохраненным в моем терминальном сеансе.

Я подтвердил, что с помощью тега latest в URL-адресе источника изображения определения задачи есть вновь запущенный экземпляр службы, который извлекает изображение с тегом latest из ECR.

Без необходимости регистрировать новую редакцию определения задачи.

В качестве sidenote нужно быть осторожным с обработкой тега latest. В этом сценарии это, кажется, работает, но во многих других случаях это будет подвержено ошибкам: Ref1 , Ref2

...