为什么从gitlab ci运行时aws cli正在执行旧的docker映像?

问题描述 投票:1回答:1

我将docker映像推送到我的私有docker hub帐户,然后运行aws cli从docker映像启动实例。但是,aws cli总是执行映像的先前版本,而不是最新版本。因此,为了执行最新版本,我需要手动重新部署甚至有时重新启动实例。我检查了aws cli是否在docker hub中更新docker hub映像后45秒开始。然后,作为测试,我在运行aws cli之前在部署阶段在gitlab yaml文件中添加了sleep 300before_script

Elastic 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:

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'
amazon-web-services docker gitlab dockerhub
1个回答
0
投票

如果使用单一容器方法:

Dockerrun.aws.json文件中,请确认“图片”部分中包含“更新”:“真”。这指示Elastic Beanstalk始终检查Docker Hub存储库中是否有新映像。如果此设置为“ false”,则Elastic Beanstalk服务将更喜欢使用以前下载的图像。

documentation

[当您在Dockerrun.aws.json文件中指定图像时,每个Elastic Beanstalk环境中的实例将在以下位置运行docker pull该图像并运行它。 (可选)包括更新密钥。默认值值为true,并指示Elastic 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 container definition documentation,如果您正在运行旧任务,它们将不会自动更新:

[当新任务开始时,Amazon ECS容器代理会拉出指定图像和容器标签的最新版本采用。但是,对存储库映像的后续更新不是传播到已经运行的任务。

© www.soinside.com 2019 - 2024. All rights reserved.