带有 docker 的 AWS Elastic Beanstalk 版本不正确

Posted

技术标签:

【中文标题】带有 docker 的 AWS Elastic Beanstalk 版本不正确【英文标题】:AWS Elastic Beanstalk with docker incorrect version 【发布时间】:2020-08-16 04:20:34 【问题描述】:

我正在使用 travis 将 docker 映像从 Github 部署到 AWS 弹性 beanstalk。该部分正常,实际部署以 0 退出,并且 S3 存储桶中有一个 .zip 文件。

问题是,由于这是我第一次使用 AWS,我使用示例应用程序创建了应用程序,因为代码是从 Github 部署的,并且在部署后,我得到的运行状况状态为降级(红色感叹号)留言:

ERROR
During an aborted deployment, some instances may have deployed the new application version. To ensure all instances are running the same version, re-deploy the appropriate application version.

如果我转到原因,我会发现:

应用程序部署在 2020-05-01T16:01:58Z 失败,退出状态为 1 并且错误:引擎执行遇到错误。 不正确的应用程序版本“travis-e55e05342a8cc16f3f28f8e184735667a9531ffa-1588311901”(部署 4)。预期版本“示例应用程序”(部署 1)。

我什至删除了示例应用程序并重新部署了已上传的应用程序并出现了该特定错误。正如您在上一条消息中看到的那样,我已经部署了 3 次,得到了相同的结果。

最后,我从 S3 存储桶中下载了 zip 文件,发现里面基本上是 srcpublic 文件夹以及根文件夹中的所有文件,例如 package.json.gitignore 所有 docker 文件,等等


编辑

我在 github 中创建了两个单独的 repos 来测试这个。 第一个 repo 是 Docker 容器中的静态页面,非常简单。我在 EB 中创建了一个环境,并从示例应用程序开始一切。然后我将更改推送到 github,travis 完成它并将应用程序部署到 AWS。这工作正常,应用程序的环境已更新,没有错误。这是回购: https://github.com/rhernandog/docler-static-page-aws

第二个 repo 是一个简单的 react 应用。同样的过程,使用示例应用程序在 EB 中创建环境。将代码推送到 github,travis 完成并部署到 AWS。这失败了,我一直收到同样的错误:

Environment health has transitioned from Info to Degraded. Command failed on all
instances. Incorrect application version found on all instances. Expected version
"Sample Application" (deployment 1). Application update failed 1 second ago and
took 2 minutes.

这是 react 应用的 repo: https://github.com/rhernandog/react-docker-awseb

就 Docker 而言,在我的本地机器上一切正常。


编辑 2

根据@stefansundin 的建议,我将应用程序重新部署到 EB 并检查日志。我结束查看完整日志以获取更多信息并发现: /var/log/cfn-hup.log

2020-05-14 17:07:42,605 [WARNING] Action for aws-eb-command-handler exited with 1, returning FAILURE

我发现错误的唯一地方是引擎日志文件: /var/log/eb-engine.log

2020/05/14 17:07:42.514601 [INFO] Executing instruction: Docker Specific Build Application
2020/05/14 17:07:42.514605 [INFO] start build docker app
2020/05/14 17:07:42.514615 [INFO] fetch image name
2020/05/14 17:07:42.514639 [INFO] authenticate with ECR if the image is in an ECR repo
2020/05/14 17:07:42.514644 [INFO] pull docker image if update is not false in dockerrun.aws.json
2020/05/14 17:07:42.514657 [INFO] Running command /bin/sh -c docker pull node:12-alpine AS builder
2020/05/14 17:07:42.558923 [ERROR] "docker pull" requires exactly 1 argument.

所以基本上这是在 dockerfile 中抱怨这个:FROM node:12-alpine AS builder。你可以在 repo 中看到整个文件:https://github.com/rhernandog/react-docker-awseb/blob/master/Dockerfile

关键是:为什么这不会发生在我的本地机器上?我怎样才能真正从构建命令中获取文件并将它们复制到 nginx 文件夹中?

这实际上是我在日志文件中发现的唯一错误。

【问题讨论】:

嗨,你能确认你能在本地的 docker 上运行这个吗? 是的,在本地一切正常,使用 docker compose 进行生产构建和开发构建。在开发版本的情况下,它甚至可以与热重载一起使用。我在 Windows 上,但我使用 Linux 容器安装了 docker。我什至将 Git 配置更改为在行尾序列中仅使用 LF 而不是 CRLF。 【参考方案1】:

我的节点应用程序中也出现了类似的错误:

Incorrect application version "travis-e55e05342a8cc16f3f28f8e184735667a9531ffa-1588311901" (deployment 4). Expected version "Sample Application" (deployment 1)

原来是我的构建和部署脚本的问题已得到纠正(在 Jenkins 中调试)应用程序成功部署在 beanstalk 中,没有错误。

原来问题不在于 Beanstalk 或应用程序版本,而在于构建机制。当没有其他方法时可以研究的东西:)

【讨论】:

【参考方案2】:

我在 docker 容器中遇到了同样的问题。

我尝试了该主题的所有建议,该主题的链接,但没有任何帮助。

最后,以下操作有所帮助:

    启用增强的健康面板https://docs.aws.amazon.com/elasticbeanstalk/latest/dg/health-enhanced-enable.html#health-enhanced-enable-console

    转到所需环境的扩展面板

    选择因“版本”问题而崩溃的实例,然后点击重启

另外:

在其中一种情况下,我必须删除所有以前的版本(左侧面板上的部分)并推送一个新版本,然后才提出上述建议。 还要确保您有足够的部署权限(代码管道/部署)

【讨论】:

【参考方案3】:

我在这里解决了这个问题:

AWS Elastic Beanstalk Docker Does not support Multi-Stage Build

这是多阶段Dockerfile的阶段命名问题。只需使用未命名的

【讨论】:

【参考方案4】:

在平台分支上创建新的网络服务器环境时,选择“Docker running on 64bit Amazon Linux”,它将工作。

【讨论】:

【参考方案5】:

我没有在 Elastic Beanstalk 上使用过 Docker。当我的 Ruby on Elastic Beanstalk 部署失败时,我发现如果我从日志中请求最后 100 行,我通常会发现问题。如果您导航到“日志”->“请求日志”->“最后 100 行”,这可能会对您有所帮助。

如果失败,我会通过 SSH 连接到实例并查看 /var/log 中的日志。也许docker psdocker logs 可以帮助你。

【讨论】:

我无法在日志的最后 100 行中找到与错误相关的任何内容,因为这是一个多星期前的事了。我得到了完整的日志,但很难说出我在这里看到的是什么。由于我删除了冲突的应用程序版本并设置回示例版本,因此我将重新部署并获取 las 100 行日志。 我使用最近重新部署的日志对原始问题添加了另一个编辑。如果您需要更多信息,请告诉我。 您可以尝试按照in this documentation 的建议添加Dockerrun.aws.json 文件吗?我怀疑如果丢失,他们会为您自动生成一个,并且它正在尝试从您的Dockerfile 中读取信息,但正在搞砸。也许您可以尝试下载应用程序版本的 zip 文件,看看里面有没有。我怀疑Image.Name 属性是错误的。【参考方案6】:

AWS Docs 这么说

要解决此问题,请启动另一个部署。您可以重新部署您知道有效的先前版本,或将您的环境配置为在部署期间忽略运行状况检查并重新部署新版本以强制完成部署。

您还可以识别和终止运行错误应用程序版本的实例。 Elastic Beanstalk 将启动具有正确版本的实例以替换您终止的任何实例。使用 EB CLI 运行状况命令来识别运行错误应用程序版本的实例。

您能否尝试删除运行您的应用程序的实例并开始全新安装?

此外,您可以使用 CodePipeline 将代码部署到 Elastic Beanstalk,您可以将 S3 文件夹用于源阶段,如果您的代码是在 travis 上构建的,则可以跳过构建过程,并使用部署阶段进行部署以安装您的新应用程序到您的 Elastic Beanstalk。将新应用安装到您的环境时可能存在一些错误配置。

如果我的问题弄错了,我建议您终止实例并启动新实例。

【讨论】:

我已经完成了很多次这个过程,repo 中的 react 应用程序和另一个使用 create react 应用程序制作的应用程序,总是得到相同的结果。使用 nginx 提供的简单静态页面没有问题,这就是我发布 repos 的原因。我没有用过 CodePipeline,因为我刚开始接触 AWS 和 Docker 我对 Travis 比较熟悉。

以上是关于带有 docker 的 AWS Elastic Beanstalk 版本不正确的主要内容,如果未能解决你的问题,请参考以下文章

带有 docker 应用程序的 AWS Elastic Beanstalk 返回 502

AWS Elastic Beanstalk Docker 来自 ECR 错误“Dockerrun.aws.json 中未指定 Docker 映像”

AWS Elastic Beanstalk - 多容器 Docker

AWS Elastic Beanstalk Docker 容器端口映射

AWS Elastic Beanstalk Docker 环境变量

使用 Dockerrun.aws.json 和 Elastic Beanstalk 命名 Docker 容器