【问题标题】:Define specific docker-compose file to use for AWS Elastic Beanstalk Deployment定义特定的 docker-compose 文件以用于 AWS Elastic Beanstalk 部署
【发布时间】:2021-06-07 23:05:20
【问题描述】:

在我运行 eb create command 之前,如何告诉 Elastic Beanstalk 使用不同的 docker-compose 文件?

比如我的项目目录:

HelloWorldDocker
├──.elasticbeanstalk
│  └──config.yml
├──app/
├──proxy/
└──docker-compose.prod.yml
└──docker-compose.yml
  1. 我的 docker-compose.yml 用于本地开发
  2. 我的docker-compose.prod.yml 是我想用于生产的东西

有没有办法在从 EB CLI 运行 eb create 命令之前定义此配置?

显而易见:我意识到我可以将docker-compose.yml 用于我的生产文件,将docker-compose.dev.yml 用于我的本地开发,但随后在本地运行docker-compose up 命令变得更加乏味(即: docker-compose -f docker-compose.dev.yml up --build...)。此外,我主要感兴趣的是这是否可能,因为我正在学习 Elastic Beanstalk,以及如果我愿意,我如何可以做到这一点。


编辑/更新:2021 年 6 月 11 日

我尝试将 .ebextensions/docker-settings.config 中的 docker-compose.prod.yml 重命名为 docker-compose.yml,如下所示:

container_commands:
  rename_docker_compose:
    command: mv docker-compose.prod.yml docker-compose.yml

>eb 部署

2021-06-11 16:44:45    ERROR   Instance deployment failed.
  For details, see 'eb-engine.log'.
2021-06-11 16:44:45    ERROR   Instance deployment: Both 
  'Dockerfile' and 'Dockerrun.aws.json' are missing in your
  source bundle. Include at least one of them. The deployment
  failed.

eb-engine.log 中,我看到:

2021/06/11 16:44:45.818876 [ERROR] An error occurred during 
  execution of command [app-deploy] - [Docker Specific Build
  Application]. Stop running the command. Error: Dockerfile and
  Dockerrun.aws.json are both missing, abort deployment

根据我的测试,这是因为 AWS 需要在进入 container_commands 的后续步骤之前调用 /bin/sh -c docker-compose config


编辑/更新 #2

如果我使用commands 而不是container_commands

commands:
  rename_docker_compose:
    command: mv docker-compose.prod.yml docker-compose.yml
    cwd: /var/app/staging

确实似乎成功完成了替换:

2021-06-11 21:40:44,809 P1957 [INFO] Command find_docker_compose_file
2021-06-11 21:40:45,086 P1957 [INFO] -----------------------Command Output-----------------------
2021-06-11 21:40:45,086 P1957 [INFO]    ./var/app/staging/docker-compose.prod.yml
2021-06-11 21:40:45,086 P1957 [INFO] ------------------------------------------------------------
2021-06-11 21:40:45,086 P1957 [INFO] Completed successfully.

但我仍然被击中:

2021/06/11 21:40:45.192780 [ERROR] An error occurred during
  execution of command [app-deploy] - [Docker Specific Build 
  Application]. Stop running the command. Error: Dockerfile and 
  Dockerrun.aws.json are both missing, abort deployment 

编辑/更新:2021 年 6 月 12 日

我使用的是 Windows 10 机器。在本地运行eb deploy 命令之前,我打开了使用 MINGW64 终端的 Git Bash。我cdd 到prebuild 存在build.sh 的目录。我跑了:

chmod +x build.sh

如果我执行ls -l,它会返回:

-rwxr-xr-x 1 Jarad 197121 58 Jun 12 12:31 build.sh*

我认为这意味着该文件是可执行的。

然后我致力于 git。

然后我跑了eb deploy

我在 eb-engine.log 中看到 build.sh: permission denied 错误。以下是相关部分的摘录。

...
2021/06/12 19:41:38.108528 [INFO] application/zip

2021/06/12 19:41:38.108541 [INFO] app source bundle is zip file ...
2021/06/12 19:41:38.108547 [INFO] extracting /opt/elasticbeanstalk/deployment/app_source_bundle to /var/app/staging/
2021/06/12 19:41:38.108556 [INFO] Running command /bin/sh -c /usr/bin/unzip -q -o /opt/elasticbeanstalk/deployment/app_source_bundle -d /var/app/staging/
2021/06/12 19:41:38.149125 [INFO] finished extracting /opt/elasticbeanstalk/deployment/app_source_bundle to /var/app/staging/ successfully
2021/06/12 19:41:38.149142 [INFO] Executing instruction: RunAppDeployPreBuildHooks
2021/06/12 19:41:38.149190 [INFO] Executing platform hooks in .platform/hooks/prebuild/
2021/06/12 19:41:38.149249 [INFO] Following platform hooks will be executed in order: [build.sh]
2021/06/12 19:41:38.149255 [INFO] Running platform hook: .platform/hooks/prebuild/build.sh
2021/06/12 19:41:38.149457 [ERROR] An error occurred during execution of command [app-deploy] - [RunAppDeployPreBuildHooks]. Stop running the command. Error: Command .platform/hooks/prebuild/build.sh failed with error fork/exec .platform/hooks/prebuild/build.sh: permission denied 

2021/06/12 19:41:38.149464 [INFO] Executing cleanup logic
2021/06/12 19:41:38.149572 [INFO] CommandService Response: {"status":"FAILURE","api_version":"1.0","results":[{"status":"FAILURE","msg":"Engine execution has encountered an error.","returncode":1,"events":[{"msg":"Instance deployment failed. For details, see 'eb-engine.log'.","timestamp":1623526898,"severity":"ERROR"}]}]}

2021/06/12 19:41:38.149706 [INFO] Platform Engine finished execution on command: app-deploy
...

知道为什么我会收到权限被拒绝错误吗?


我从这种疯狂中得出的结论

Elastic Beanstalk 的 EB CLI eb deploy 命令无法在 Windows 计算机上正确压缩文件(它创建的 app_source_bundle)。

证明

我可以通过在本地压缩它并通过 Elastic Beanstalk 在线界面手动上传 recreate Marcin's example。当我这样做并检查源包时,它显示build.sh 确实具有可执行权限(-rwxr-xr-x)。

[root@ip-172-31-11-170 deployment]# zipinfo app_source_bundle
Archive:  app_source_bundle
Zip file size: 993 bytes, number of entries: 5
drwxr-xr-x  3.0 unx        0 bx stor 21-Jun-13 03:08 .platform/
drwxr-xr-x  3.0 unx        0 bx stor 21-Jun-13 03:08 .platform/hooks/
drwxr-xr-x  3.0 unx        0 bx stor 21-Jun-13 03:08 .platform/hooks/prebuild/
-rwxr-xr-x  3.0 unx       58 tx defN 21-Jun-13 03:09 .platform/hooks/prebuild/build.sh
-rw-r--r--  3.0 unx       98 tx defN 21-Jun-13 03:08 docker-compose.prod.yml

当我 initialize and create 使用 EB CLI 和完全相同的文件时,build.sh 没有具有可执行权限 (-rw-rw-rw-)。

[ec2-user@ip-172-31-5-39 deployment]$ zipinfo app_source_bundle
Archive:  app_source_bundle
Zip file size: 1092 bytes, number of entries: 5
drwxrwxrwx  2.0 fat        0 b- stor 21-Jun-12 20:32 ./
-rw-rw-rw-  2.0 fat       98 b- defN 21-Jun-12 20:08 docker-compose.prod.yml
-rw-rw-rw-  2.0 fat      993 b- defN 21-Jun-12 20:15 myzip.zip
drwxrwxrwx  2.0 fat        0 b- stor 21-Jun-12 20:08 .platform/hooks/prebuild/
-rw-rw-rw-  2.0 fat       58 b- defN 21-Jun-12 20:09 .platform/hooks/prebuild/build.sh

因此,我认为这是 AWS EB CLI 部署命令在如何为 Windows 用户压缩文件方面的错误。

【问题讨论】:

  • commands 似乎可以工作,因为它必须在您当前工作的 eb 环境中运行。 commands 在你的 zip 文件被解压之前执行。
  • 另外,只是为了在更新后澄清。当您提供正确的文件名时,一切都在 EB 中工作?所以问题是如何将 docker-compose.prod.yml 重命名为 docker-compose.yml?
  • 是的。我有一个工作项目。当我在项目的根目录中有一个名为 docker-compose.yml 的文件时,它可以工作。当我将其重命名为 docker-compose.prod.yml 时,我想配置 Elastic Beanstalk 以在此过程中的正确时间将此文件重命名为 docker-compose.yml
  • 我用我的复制品和解决方案更新了答案。

标签: amazon-web-services docker-compose amazon-elastic-beanstalk


【解决方案1】:

您不能从命令级别执行此操作。但我想你可以编写 container_commands 脚本来重命名你的 docker-compose 文件从 docker-compose.dev.ymldocker-compose.yml

您可以使用 container_commands 键来执行影响您的应用程序源代码的命令。容器命令在应用程序和 Web 服务器设置完成并提取应用程序版本存档之后,但在应用程序版本部署之前运行。

2021 年 6 月 12 日更新

我尝试使用简化的设置,仅使用 docker-compose.prod.ymlDocker running on 64bit Amazon Linux 2 3.4.1 EB 平台来重现该问题。

docker-compose.prod.yml

version: "3"

services:
    client:
        image: nginx
        ports:
            - 80:80

我可以通过container_commands 确认并重现该问题。所以在我的测试中,解决方案是设置prebuild deployment hook

所以我的部署 zip 具有以下结构:

├── docker-compose.prod.yml
└── .platform
    └── hooks
        └── prebuild
            └── build.sh

在哪里

build.sh

#!/bin/bash

mv docker-compose.prod.yml docker-compose.yml

我还在创建部署 zip 之前创建了 build.sh 可执行文件。

app_source_bundle 权限 (zipinfo -l)

Zip file size: 1008 bytes, number of entries: 5
drwxr-xr-x  3.0 unx        0 bx        0 stor 21-Jun-12 07:37 .platform/
drwxr-xr-x  3.0 unx        0 bx        0 stor 21-Jun-12 07:37 .platform/hooks/
drwxr-xr-x  3.0 unx        0 bx        0 stor 21-Jun-12 07:38 .platform/hooks/prebuild/
-rwxr-xr-x  3.0 unx       77 tx       64 defN 21-Jun-12 07:24 .platform/hooks/prebuild/build.sh
-rw-r--r--  3.0 unx       92 tx       68 defN 21-Jun-12 07:01 docker-compose.prod.ym

【讨论】:

  • 我收到permission denied 错误。我用 EDIT / UPDATE: June 12, 2021 更新了我的问题,其中包含详细信息。你知道我做错了吗?
  • @Jarad 您是否在压缩之前使build.sh 可执行? chmod +x build.sh
  • 澄清说明:我不是在本地压缩它;我正在运行eb deploy,它将app_source_bundle 发送到/opt/elasticbeanstalk/deployment/ 和一个S3 存储桶。简短回答:是的,我在运行eb deploy 之前确实使 build.sh 可执行。我做了 chmod +x build.sh。我什至跑了git update-index --chmod=+x <path to file>。当我 SSH 进入实例并检查 build.sh (zipinfo -l app_source_bundle) 的文件权限时,它显示 -rw-rw-rw-。我不知道这是否只是因为它在一个 zip 中,或者这些是否真的是权限。但为什么呢?
  • @Jarad 我用我的权限更新了这个问题。他们是-rwxr-xr-x app_source_bundle。似乎您的权限不会以某种方式传播到 zip。在我的测试中,我没有使用 git 也没有使用 eb cli。
  • 感谢您的帮助马辛。我花了一整天的时间来弄清楚这一点。我的收获是,AWS EB CLI deploy 命令在如何压缩 Windows 机器上的文件方面存在一个错误。我能够重新创建您的示例。当我使用 EB CLI 时,相同的文件不起作用!
【解决方案2】:

我能够通过以下方式绕过这个烦人的错误:

  1. 使用 git 和 AWS CodeCommit
  2. 正在运行git add --chmod=+x .platform/hooks/prebuild/build.sh

这规避了与 Windows 相关的问题,因为:

当您使用 EB CLI 存储库配置 CodeCommit 时,EB CLI 使用存储库的内容来创建源包。当你 运行 eb deploy 或 eb create,EB CLI 推送新的提交并使用 分支的 HEAD 修订以创建它部署到的存档 您环境中的 EC2 实例。

来源:Deploying from your CodeCommit repository

【讨论】:

  • 几乎尝试了所有方法,CodeCommit 是解决此问题的唯一方法之一。
猜你喜欢
  • 2017-01-29
  • 2015-04-05
  • 2015-09-20
  • 2015-11-02
  • 2016-06-19
  • 2020-08-02
  • 2014-12-25
  • 2020-05-01
  • 2016-09-20
相关资源
最近更新 更多