首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >elastic-beanstalk docker应用程序在部署时不更新

elastic-beanstalk docker应用程序在部署时不更新
EN

Stack Overflow用户
提问于 2014-11-21 07:39:40
回答 4查看 3.8K关注 0票数 10

我在git库中有一个Dockerfile/elastic-beanstalk应用程序,它从s3中提取当前版本的应用程序并启动它。这在我第一次部署时效果很好;Docker容器构建完成,应用程序启动并正常运行。在我对应用程序进行了更改,重新将tarball上传到s3并运行eb deploy之后,问题就出现了。

代码语言:javascript
复制
$ 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自动重新安装应用程序。

EN

回答 4

Stack Overflow用户

发布于 2014-11-23 07:41:37

使用Docker for CI的问题是,它的行为不像脚本,除非Dockerfile更改,否则它不会重新构建。因此,您必须将每次需要重新构建的内容放在启动包装器脚本中,而不是放在Dockerfile中。因此,我将下载应用程序tarball的部分移到了Dockerfile安装到容器中的脚本中。然后,当容器启动时,tarball被下载并解压缩,只有这样才能启动真正的应用程序。这是可行的,重新部署现在可以按预期工作。调试这个过程有点麻烦,并让我认为使用Docker和EB进行CI有点像是一种攻击。

票数 6
EN

Stack Overflow用户

发布于 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 1here part 2提供了概述),我发现了这个问题。

为了补充这篇文章,在EBS中有一个3阶段的过程,该过程是在EC2实例上启动的,用于部署docker镜像。

  1. pre
  2. enact
  3. post

此3阶段流程是位于/opt/elasticbeanstalk/hooks/appdeploy/中的一系列执行的bash文件。

前置阶段包含以下shell脚本:

  1. 00clean_dir.sh -清理将下载源代码的目录,删除docker容器和镜像(例如cleanup)
  2. 01unzip.sh -从docker下载源代码并解压缩it
  3. 02loopback-check.sh -验证您没有docker回送设置set
  4. 03build.sh -这是EC2将从docker文件或Dockerrun.aws.json构建docker镜像的神奇之处。经过多次测试,我意识到这个构建脚本正在构建我更新的映像,但我修改了这个脚本,以便在docker构建中也包含--no-cache标志。

enact阶段是我的缓存问题实际发生的地方。制定阶段包括:

  1. 00run.sh -这是根据Dockerrun.aws.json中的环境变量和设置对在准备阶段生成的映像执行停靠运行的位置。这就是导致me.
  2. 01flip.sh缓存问题的原因-从aws-staging转换到当前的应用程序以及

中的许多其他东西

当我从Pre stage中生成的映像03build.sh执行docker run时,我会看到更新后的更改。但是,当我执行00run.sh shell脚本时,旧的更改将会出现。在研究docker run命令之后,它正在执行

代码语言:javascript
复制
`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文件有

代码语言:javascript
复制
"Volumes": [
    {
      "ContainerDirectory": "/usr/share/nginx/html/"
    }
  ],

而没有引用的主机位置。因此,我未来所做的任何更改都没有更新。

对于我的解决方案,我只是删除了"Volumes"数组,因为我所有的文件都包含在我上传到ECR的docker镜像中。注意:您可能还需要将--no- 03build.sh添加到缓存中。

票数 1
EN

Stack Overflow用户

发布于 2014-11-22 00:02:17

我想知道当您在Beanstalk中定义实例时,是否可以尝试使用用户数据输入?像这样的东西可能会在启动结束时立即触发:

代码语言:javascript
复制
 #!/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

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/27051683

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档