我在git库中有一个Dockerfile/elastic-beanstalk应用程序,它从s3中提取当前版本的应用程序并启动它。这在我第一次部署时效果很好;Docker容器构建完成,应用程序启动并正常运行。在我对应用程序进行了更改,重新将tarball上传到s3并运行eb deploy之后,问题就出现了。
$ eb deploy
INFO: Environment update is starting.
INFO: Deploying new version to instance(s).
INFO: Successfully built aws_beanstalk/staging-app
INFO: Successfully pulled yadayada/blahblah:latest
INFO: Docker container 06608fa37b2c is running aws_beanstalk/current-app.
INFO: New application version was deployed to running EC2 instances.
INFO: Environment update completed successfully.但该应用程序尚未在*.elasticbeanstalk.com上更新。我猜由于Dockerfile没有改变,docker不会重新构建容器(并拉出最新的应用程序tarball)。我希望能够强制重建,但eb工具似乎没有这个选项。我可以从网站控制台强制重建,但显然这对自动化没有好处。我将每个更改都提交给git,我希望eb能利用这一点来知道重建是必要的,但这似乎没有什么不同。我使用docker/elastic-beanstalk的方式有误吗?理想情况下,我希望使用git,并让beanstalk自动重新安装应用程序。
发布于 2014-11-23 07:41:37
使用Docker for CI的问题是,它的行为不像脚本,除非Dockerfile更改,否则它不会重新构建。因此,您必须将每次需要重新构建的内容放在启动包装器脚本中,而不是放在Dockerfile中。因此,我将下载应用程序tarball的部分移到了Dockerfile安装到容器中的脚本中。然后,当容器启动时,tarball被下载并解压缩,只有这样才能启动真正的应用程序。这是可行的,重新部署现在可以按预期工作。调试这个过程有点麻烦,并让我认为使用Docker和EB进行CI有点像是一种攻击。
发布于 2017-06-30 17:24:59
TLDR:您可能正在使用没有缓存的ContainerDirectory,或者您可能需要更新缓存以使用--no- HostDirectory =true标志进行构建。
经过无数个小时后,我终于用我的用例解决了这个问题。我正在使用CodePipeline运行CodeCommit、CodeBuild和Elastic Beanstalk,以便使用docker在亚马逊网络服务中创建持续集成/持续交付解决方案。我遇到的问题是,CodeBuild成功地构建了新的docker镜像并将其发布到AWS ECR (EC2容器注册表),EBS正确地拉下了新镜像,但docker镜像从未在服务器上更新。
在检查了EBS如何构建docker镜像的整个过程之后(有一篇非常棒的文章here, part 1和here part 2提供了概述),我发现了这个问题。
为了补充这篇文章,在EBS中有一个3阶段的过程,该过程是在EC2实例上启动的,用于部署docker镜像。
此3阶段流程是位于/opt/elasticbeanstalk/hooks/appdeploy/中的一系列执行的bash文件。
前置阶段包含以下shell脚本:
enact阶段是我的缓存问题实际发生的地方。制定阶段包括:
中的许多其他东西
当我从Pre stage中生成的映像03build.sh执行docker run时,我会看到更新后的更改。但是,当我执行00run.sh shell脚本时,旧的更改将会出现。在研究docker run命令之后,它正在执行
`Docker command: docker run -d -v null:/usr/share/nginx/html/ -v /var/log/eb-docker/containers/eb-current-app:/var/log/nginx ca491178d076`-v null:/usr/share/nginx/html/就是破坏它并导致它无法更新的原因。这是因为我的Dockerrun.aws.json文件有
"Volumes": [
{
"ContainerDirectory": "/usr/share/nginx/html/"
}
],而没有引用的主机位置。因此,我未来所做的任何更改都没有更新。
对于我的解决方案,我只是删除了"Volumes"数组,因为我所有的文件都包含在我上传到ECR的docker镜像中。注意:您可能还需要将--no- 03build.sh添加到缓存中。
发布于 2014-11-22 00:02:17
我想知道当您在Beanstalk中定义实例时,是否可以尝试使用用户数据输入?像这样的东西可能会在启动结束时立即触发:
#!/bin/bash
cd /app/dir/home
sudo docker pull username/container
... other things you may need to do ...有关用户数据脚本和可执行文件的更多信息:http://docs.aws.amazon.com/AWSEC2/latest/UserGuide/user-data.html
https://stackoverflow.com/questions/27051683
复制相似问题