Почему aws cli выполняет старое docker изображение при запуске из gitlab ci? - PullRequest
0 голосов
/ 20 февраля 2020

Я помещаю свой docker образ в свою личную учетную запись docker, а затем запускаю aws cli, чтобы запустить экземпляр из docker образа. Однако aws cli всегда выполняет предыдущую версию образа, а не самую последнюю. Поэтому, чтобы выполнить самые последние обновления, мне нужно вручную повторно развернуть или даже перезапустить экземпляр. Я проверил, что aws cli начинается через 45 секунд после того, как docker образ концентратора обновляется в docker hub. Затем в качестве теста я добавил sleep 300 секунд before_script в файл gitlab yaml на этапе развертывания, прежде чем запустить aws cli.

Кажется, что в Elasti c beanstalk есть какой-то кэш который не обновляет среду должным образом. Кто-нибудь когда-нибудь сталкивался с такой проблемой?

Это моя конфигурация gitlab yaml в моем подпроекте:

.build-docker-image:
  image: docker:18
  stage: build
  before_script:
    - docker login -u "$CI_REGISTRY_USER" -p "$CI_REGISTRY_PASSWORD" $CI_REGISTRY
  services:
    - docker:dind
  script:
    - echo branch $CI_COMMIT_REF_NAME tag $CI_COMMIT_TAG
    - docker build .
    - docker push "$CI_REGISTRY_IMAGE"
  except:
    variables:
      - $SKIP_BUILD == "1"

docker-build-staging:
  extends: .build-docker-image
  environment:
    name: subprojectname
  only:
    variables:
      - $CI_COMMIT_REF_NAME == "staging"
  variables:
    CI_REGISTRY_IMAGE: myproject/subproject:staging

amazon_beanstalk_staging:
  extends: .amazon_beanstalk
  environment:
    name: subprojectname
    url: 'https://subprojectname.com'
  variables:
    AWS_VERSION: $STAGING_AWS_VERSION_BETA
    AWS_ENV_NAME: $STAGING_AWS_ENV_BETA
  only:
    variables:
      - $CI_COMMIT_REF_NAME == "staging"

и это папка gitlab yaml в папке root, которая содержит все подпроекты:

image: node

stages:
  - build
  - deploy

# sleep 300 seconds in order to prevent aws running old docker image
.amazon_beanstalk:
  stage: deploy
  image: garland/aws-cli-docker:latest
  before_script:
    - sleep 300
  script:
    - sh -c  "aws configure set region '$AWS_REGION' && aws elasticbeanstalk update-environment --environment-name '$AWS_ENV_NAME' --version-label '$AWS_VERSION'"

include:
  - local: 'pathToMySubproject/.gitlab-ci.yml'

1 Ответ

1 голос
/ 23 февраля 2020

(обновляется после комментария от @hitchhiker): для четкого вывода информации об устранении неполадок убедитесь, что для вашей среды включены журналы CloudWatch, и просмотрите журнал для ecs-agent.log, и вы можете увидеть шаги PULL, выполненные агентом. Мне удалось увидеть очень конкретные c шаги PULL, когда среда была обновлена ​​или среда была перезапущена.

Очень жаль, что у вас все еще есть проблемы. Спасибо за подтверждение, что вы используете v2. Я попытался угадать вашу задачу и воспроизвести ее. После запуска update-environment система автоматически выполнила PULL моего обновленного образа, даже если я использовал точно такую ​​же метку версии. Кроме того, после перезапуска экземпляра (с консоли Elasti c Beanstalk) было получено новое изображение.


Исходный ответ:

Если вы используете подход с одним контейнером:

Внутри вашего Dockerrun.aws.json файла, пожалуйста, подтвердите, что у вас есть «Update»: «true "внутри вашего раздела" Изображение ". Это указывает Elasti c Beanstalk на постоянную проверку вашего Docker Hub репозитория на наличие новых изображений. Если для этого параметра установлено значение «false», служба Elasti c Beanstalk предпочтет использовать ранее загруженный образ.

Из документации :

Когда вы указываете изображение в файле Dockerrun.aws.json, каждый экземпляр в вашей среде Elasti c Beanstalk будет запускать docker pull для этого образа и запускать его. При желании, включите ключ обновления. Значение по умолчанию true и указывает Elasti c Beanstalk проверять репозиторий, извлекать любые обновления изображения и перезаписывать любые кэшированные изображения.

{
  "AWSEBDockerrunVersion": "1",
  "Image": {
    "Name": "janedoe/image",
    "Update": "true"
  },
  "Ports": [
    {
      "ContainerPort": "1234"
    }
  ],
  "Volumes": [
    {
      "HostDirectory": "/var/app/mydb",
      "ContainerDirectory": "/etc/mysql"
    }
  ],
  "Logging": "/var/log/nginx",
  "Entrypoint": "/app/bin/myapp",
  "Command": "--argument"
}

Также обратите внимание на Документация по определению контейнера ECS , если у вас запущены старые задачи, они не будут автоматически обновляться:

При запуске новой задачи агент контейнера Amazon ECS извлекает последнюю версию указанное изображение и тег для контейнера для использования. Однако последующие обновления образа хранилища не распространяются на уже запущенные задачи.

...