我将docker映像推送到我的私有docker hub帐户,然后运行aws cli从docker映像启动实例。但是,aws cli总是执行映像的先前版本,而不是最新版本。因此,为了执行最新版本,我需要手动重新部署甚至有时重新启动实例。我检查了aws cli是否在docker hub中更新docker hub映像后45秒开始。然后,作为测试,我在运行aws cli之前在部署阶段在gitlab yaml文件中添加了sleep 300
秒before_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'
如果使用单一容器方法:
在Dockerrun.aws.json
文件中,请确认“图片”部分中包含“更新”:“真”。这指示Elastic Beanstalk始终检查Docker Hub存储库中是否有新映像。如果此设置为“ false”,则Elastic Beanstalk服务将更喜欢使用以前下载的图像。
[当您在
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容器代理会拉出指定图像和容器标签的最新版本采用。但是,对存储库映像的后续更新不是传播到已经运行的任务。