在AWS Beanstalk上使用Docker Compose部署Docker

13

我正在尝试在AWS Beanstalk上部署多个node.js微服务,并希望它们部署在同一实例上。这是我第一次部署多个服务,所以我需要有人帮助我解决一些故障。因此,我首先尝试将它们打包到一个Docker容器中。同时我使用Docker Compose来管理结构。它在我的虚拟机上本地运行良好,但当我将其部署到Beanstalk时,遇到了一些问题。

我知道的:

  1. 我知道我必须选择部署为多容器Docker。
  2. 管理多个node.js服务的最佳方法是使用Docker Compose。
  3. 我需要一个dockerrun.aws.json文件来运行node.js应用程序。
  4. 我需要为该ECS实例创建任务定义。

我遇到的问题:

  1. 我只能找到php的dockerrun.aws.json task_definition.json 模板,因此我无法验证那两个JSON文件中的node.js配置是否正确。
  2. 看起来docker-compose.ymldockerrun.aws.jsontask_definition.json 都在进行相似的工作。我必须保留task_definition,但我是否还需要dockerrun.aws.json
  3. 我尝试在ECS中运行任务,但它立即停止。我如何检查任务的日志记录?

我得到了:

在环境中找不到ECS任务定义(或空定义文件)

因为我的任务总是会立即停止。如果我能够检查日志,那么进行故障排除将更加容易。

这是我的task_definition.json

{
  "requiresAttributes": [],
  "taskDefinitionArn": "arn:aws:ecs:us-east-1:231440562752:task-definition/ComposerExample:1",
  "status": "ACTIVE",
  "revision": 1,
  "containerDefinitions": [
    {
      "volumesFrom": [],
      "memory": 100,
      "extraHosts": null,
      "dnsServers": null,
      "disableNetworking": null,
      "dnsSearchDomains": null,
      "portMappings": [
        {
          "hostPort": 80,
          "containerPort": 80,
          "protocol": "tcp"
        }
      ],
      "hostname": null,
      "essential": true,
      "entryPoint": null,
      "mountPoints": [
        {
          "containerPath": "/usr/share/nginx/html",
          "sourceVolume": "webdata",
          "readOnly": true
        }
      ],
      "name": "nginxexpressredisnodemon_nginx_1",
      "ulimits": null,
      "dockerSecurityOptions": null,
      "environment": [],
      "links": null,
      "workingDirectory": null,
      "readonlyRootFilesystem": null,
      "image": "nginxexpressredisnodemon_nginx",
      "command": null,
      "user": null,
      "dockerLabels": null,
      "logConfiguration": null,
      "cpu": 99,
      "privileged": null
    }
  ],
  "volumes": [
    {
      "host": {
        "sourcePath": "/ecs/webdata"
      },
      "name": "webdata"
    }
  ],
  "family": "ComposerExample"
}

也许这会有所帮助 https://github.com/ingenieux/beanstalker/issues/63 - taco
@taco,这不完全是我要找的,但我可能会在此问题跟踪器中发布我的问题,谢谢。 - RandomEli
我没有使用他们的Beanstalk。 - RandomEli
嗨,我不知道这是否有帮助,但我遇到了同样的问题,因为我的Dockerrun.aws.json文件没有提交。EB客户端会忽略(我猜)未提交的文件。此外,我认为您不需要同时使用Dockerrun.aws.json和task_definition.json两个文件。正如您所说,它们正在执行相同的工作。我只使用了Dockerrun文件,并成功部署了包含nodejs应用程序和redis镜像的docker compose。敬礼。 - nboukeffa
我也遇到了同样的问题。你是怎么解决的?正如Nad1所说,我们只需要dockerrun.aws.json文件,其中包含docker容器的定义。但是我收到了一个错误,指出没有找到ECS任务。 - Lakshman Diwaakar
显示剩余2条评论
7个回答

9

我曾经遇到过类似的问题,后来发现我直接将包含文件夹存档到了Archive.zip文件中,导致在Archive.zip文件中出现了这样的结构:

RootFolder
    - Dockerrun.aws.json
    - Other files...

事实证明,仅存档RootFolder的内容(而不是文件夹本身),Amazon Beanstalk就可以识别ECS任务定义文件。希望这可以帮到你。

3
对我来说,这只是确保文件名与AWS文档中描述的大小写完全匹配的情况。 dockerfile.aws.json 必须精确地为 Dockerfile.aws.json

1
类似的问题。对我有用的解决方法是使用CLI工具而不是自己压缩文件,只需运行eb deploy即可。

1
对我来说,CodeCommit一开始无法使用。但是在将Dockerrun.aws.json添加到git中后,它就可以正常工作了。

0

我因为错误而到达这里。我的问题是我使用标签部署:

eb deploy --label MY_LABEL

你需要做的是使用'进行部署:

eb deploy --label 'MY_LABEL'

0
在我的情况下,我创建了 Dockerrun.aws.json 文件后没有提交它,因此使用 eb deploy 失败并出现相同的错误。

0

我也遇到了这个问题。我的问题是没有将Dockerrun.aws.json添加到git中。eb deploy检测到了git的存在。

我运行了eb deploy --verbose来找出问题所在:

INFO: Getting version label from git with git-describe
INFO: creating zip using git archive HEAD

它进一步列出将放入zip的所有文件,但Dockerrun.aws.json不在其中。

git status报告如下:

On branch master
Your branch is up to date with 'origin/master'.

Untracked files:
  (use "git add <file>..." to include in what will be committed)

    Dockerrun.aws.json

nothing added to commit but untracked files present (use "git add" to track)

将文件添加到git并提交有所帮助。 在我的特定情况下,我可以在脚本化部署中删除.git目录。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接