【问题标题】:elastic-beanstalk docker app not updating upon deployelastic-beanstalk docker应用在部署时未更新
【发布时间】:2015-01-19 00:39:51
【问题描述】:

我在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 不会重建容器(并拉取最新的应用程序压缩包)。我希望能够强制重建,但eb 工具似乎没有该选项。我可以从网站控制台强制重建,但显然这不利于自动化。我将每次更改提交给git,我希望eb 会使用它来知道重建是必要的,但这似乎没有任何区别。我是否以错误的方式使用 docker/elastic-beanstalk?理想情况下,我想提交 git 并让 beanstalk 自动重新安装应用程序。

【问题讨论】:

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


    【解决方案1】:

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

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

    在检查了 EBS 如何构建 docker 映像的整个过程之后(有一篇非常棒的文章 here, part 1here part 2 给出了概述),我发现了这个问题。

    补充一点,在 EBS 中,EC2 实例上有一个 3 个阶段的过程,这些实例是为部署 docker 映像而启动的。

    1. 制定
    2. 发帖

    这个 3 阶段过程是一系列执行的 bash 文件,这些文件位于 /opt/elasticbeanstalk/hooks/appdeploy/

    前期包含以下shell脚本:

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

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

    1. 00run.sh - 这是根据环境变量和 Dockerrun.aws.json 中的设置对 pre 阶段生成的映像执行 docker run 的地方。这就是导致我出现缓存问题的原因。
    2. 01flip.sh - 从 aws-staging 转换为 current-app 以及许多其他内容

    当我从 Pre 阶段 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。

    【讨论】:

      【解决方案2】:

      您可能应该 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
      

      使用 git aws.push 代替 eb deploy 将所有内容添加并提交到 ElasticBeanstalk

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

      【讨论】:

        【解决方案3】:

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

        【讨论】:

        • 我也有同样的问题。重新部署我的网络应用程序,但它没有更新。你能提供更精确的解决方法吗?目前我的 Dockerfile 调用运行我的 Web 服务器的 .sh 脚本
        【解决方案4】:

        我想知道您是否可以在 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

        【讨论】:

        • 看起来 beanstalk 不支持用户数据 - 至少根据 thisthis.
        猜你喜欢
        • 2016-10-27
        • 2016-09-20
        • 2015-10-23
        • 2015-12-17
        • 2017-01-29
        • 2020-08-17
        • 2015-07-31
        • 2014-12-13
        • 2016-10-16
        相关资源
        最近更新 更多