为啥 Docker 构建命令在 Elastic Beanstalk 中运行如此缓慢?

Posted

技术标签:

【中文标题】为啥 Docker 构建命令在 Elastic Beanstalk 中运行如此缓慢?【英文标题】:Why are Docker build commands running so slow in Elastic Beanstalk?为什么 Docker 构建命令在 Elastic Beanstalk 中运行如此缓慢? 【发布时间】:2014-11-15 19:23:46 【问题描述】:

EB 抱怨我的构建超时,所以我 ssh 进入一个实例并决定自己运行 docker build 以查看发生了什么。每一步,即使是像mkdir 这样简单的事情也需要很长时间才能运行。即使是 WORKDIR 在执行前至少会停顿一两分钟。

在我的本地机器上,这些是即时的。怎么回事?

【问题讨论】:

【参考方案1】:

在 AWS 上运行的 Ubuntu 机器也存在同样的问题。原来解决方案的关键是从 devicemapper 切换到 aufs 存储后端。

首先,运行以下命令以确定您当前使用的存储后端:

docker info | grep Storage

如果它显示devicemapper,您可能找到了缓慢的原因。

这是在 Ubuntu 中切换到 aufs 后端的过程,取自here:

    sudo apt-get install -y -q linux-image-extra-$(uname -r) sudo service docker restart

请注意,您必须重建所有现有的图像/容器,因为当您切换到 aufs 时它们将被擦除。

【讨论】:

太棒了。它现在快了一千倍,你拯救了我的一天。 注意:基于 Amazon Linux 的 AMI 使用 yum 命令而不是 apt-get。 ***.com/questions/14045262/… AWS linux 的包名是什么?【参考方案2】:

很抱歉知道您遇到了这个问题。 Elastic Beanstalk 环境创建涉及创建大量资源,如自动缩放组、EC2 实例、安全组、Elastic Load Balancer 等。在您的 beanstalk 实例上安装该软件之后。我假设您只是在谈论 beanstalk 上软件安装(docker build)的缓慢性。

如果你只是运行 mkdir 那应该不会很慢。它应该相当快。

但是,如果您认为 docker build 整体运行速度非常慢,那可能是因为 IO 密集型操作。

您可以尝试使用EBS provisioned IOPs with Elastic Beanstalk。 阅读有关 SSD 实例的更多信息here。

您能否尝试使用 SSD 实例启动一个新环境,看看 docker build 是否仍然很慢?如果你能展示一个需要很长时间构建的示例 dockerfile,我可以试试。

【讨论】:

无论哪种方式,简单的RUN mkdir ~/asd 都需要很长时间。这应该与 EBS 引导相关的事情无关。我怀疑 FS 真的是阻塞因素,因为我可以运行 apt-get 并且它可以非常快速地获取内容。 还需要下载您的 dockerfile 包含的基本 docker 映像(可能很容易达到 100MB)。这需要第一次在每个 EC2 实例上下载。你认为这是导致最初缓慢的原因吗?您可以运行docker images 来查看当前正在下载哪些图像。 这些是运行命令。这些会在初始图像下载后发生。 如果只是运行缓慢的命令,那么它可能与 docker 映像有关……您是否可以提供一些示例 Dockerfile,我可以用它来重现问题? 您在什么实例类型上运行它?我最近开始在 Beanstalk 上使用 Docker 进行测试,但令我沮丧的是,那些小的 t1.micro 实例无法处理很多事情。一旦我切换到 t2.small,构建 Docker 容器从大约 10 分钟缩短到 2 分钟。

以上是关于为啥 Docker 构建命令在 Elastic Beanstalk 中运行如此缓慢?的主要内容,如果未能解决你的问题,请参考以下文章

调试 Elastic Beanstalk Docker 运行失败?

在 Docker 中为 AWS Elastic Beanstalk 构建期间访问 .env 变量

Elastic Beanstalk 未能部署新的 docker 映像

docker 和 elastic beanstalk 容器意外停止并且权限被拒绝

将 Docker 部署到 AWS Elastic Beanstalk:无法执行命令“docker pull maven”

为啥 docker build 中的 COPY 未检测到更新