elastic-beanstalk docker app在部署时不会更新

时间:2014-11-20 23:39:40

标签: amazon-web-services amazon-ec2 amazon-s3 docker elastic-beanstalk

我在Dockerfile repo中有一个elastic-beanstalk / git个应用程序,它从s3中提取当前版本的应用程序的tarball并启动它。这在我第一次部署时效果很好; 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自动重新安装应用程序。

4 个答案:

答案 0 :(得分:6)

使用Docker for CI的问题在于它不像脚本一样,除非Dockerfile发生变化,否则它不会重建。因此,您必须每次在启动包装器脚本而不是Dockerfile中放置需要重建的内容。所以我将下载应用程序tarball的部分移动到Dockerfile安装到容器的脚本中。然后当容器启动时,下载并解压缩tarball,然后才能启动真正的应用程序。这种方法有效,现在重新部署可以按预期工作。调试过程有点加剧,并让我认为使用Docker和EB for CI是一种黑客攻击。

答案 1 :(得分:0)

我想知道在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

答案 2 :(得分:0)

您应该 read this first 以更好地了解我们将在本地GIT信息库中使用本地网站以及 how to push it 最多ElasticBeanstalk以使网站生效。

在我们网站的根目录中查找或创建一个名为 .elasticbeanstalk 的文件夹。
在该文件夹中,我们将制作两个文件:

<强>配置

[global]
ApplicationName=YourApplicationNameFromAWSConsole
AwsCredentialFile=.elasticbeanstalk/aws_credentials
DevToolsEndpoint=git.elasticbeanstalk.us-east-1.amazonaws.com
EnvironmentName=EnvironmentNameFromAWSConsole
Region=us-east-1

<强> aws_credentials

[global]
AWSAccessKeyId=AKIAxxxxxxxxxxxxxxxxxxxxx
AWSSecretKey=xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx

而不是eb deploy使用git aws.push向ElasticBeanstalk添加和提交所有内容

git add *.*
git commit -m "Adding AWS Configs"
git aws.push

答案 3 :(得分:0)

TLDR:您可能在没有HostDirectory的情况下使用ContainerDirectory,或者您可能需要使用--no-cache = true标志更新03build.sh以构建。

经过几十万小时之后,我终于用我的用例修复了这个问题。我正在使用CodePipeline运行CodeCommit,CodeBuild和Elastic Beanstalk,以便在AWS中使用docker创建持续集成/持续交付解决方案。我遇到的问题是CodeBuild成功构建并将新的docker映像发布到AWS ECR(EC2容器注册表),EBS正确地下拉了新映像,但Docker映像从未在服务器上更新。

在检查了EBS如何构建泊坞窗图像的整个过程之后(我发现了一篇非常棒的文章here, part 1here part 2),我发现了这个问题。

要添加到文章中,在EBS上有一个三阶段流程,用于部署docker镜像的EC2实例。

  1. 颁布
  2. 此3阶段过程是一系列执行的bash文件,位于/opt/elasticbeanstalk/hooks/appdeploy/

    前级包含以下shell脚本:

    1. 00clean_dir.sh - 清除将下载源的目录,删除docker容器和图像(例如清理)
    2. 01unzip.sh - 从S3下载源并解压缩
    3. 02loopback-check.sh - 验证您没有设置docker loopback设置
    4. 03build.sh - 这就是EC2将从Dockerfile或Dockerrun.aws.json构建docker镜像的地方。经过大量测试后,我意识到这个构建脚本正在构建我的更新映像,但我修改了这个脚本,以便在docker build上包含--no-cache标志。
    5. 实施阶段是我的缓存问题实际发生的地方。制定阶段包括:

      1. 00run.sh - 这是根据Dockerrun.aws.json中的环境变量和设置对前台生成的图像执行docker run的地方。这就是导致缓存问题的原因。
      2. 01flip.sh - 从aws-staging转换为current-app和许多其他东西
      3. 当我从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-cache添加到03build.sh。