【问题标题】:Deploy docker on AWS beanstalk with docker composer使用 docker composer 在 AWS beanstalk 上部署 docker
【发布时间】:2016-10-14 03:58:15
【问题描述】:

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

我知道的:

  1. 我知道我必须选择部署为多容器 docker。
  2. 管理多个 node.js 服务的最佳实践是使用 docker composer。
  3. 我需要一个 dockerrun.aws.json 用于 node.js 应用程序。
  4. 我需要为该 ecs 实例创建任务定义。

我有问题的地方:

  1. 我只能找到dockerrun.aws.jsontask_definition.json php的模板,所以我无法验证我的node.js配置是否 这两个 json 文件的形状正确。
  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"
}

【问题讨论】:

  • @taco,这不是我要找的,但我不妨在这个问题跟踪器中发布我的问题,谢谢。
  • 我没有使用他们的beanstalker
  • 这似乎是一个类似的问题,但足以被认为是正确的答案。不幸的是,我对 AWS 帮助不大。
  • 是的,它们是相当新的技术,我还有什么想法可以让这个问题更通用,以便更多人可以查看?

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


【解决方案1】:

我遇到了类似的问题,结果我将包含文件夹直接存档在我的 Archive.zip 文件中,因此在 Archive.zip 文件中给了我这个结构:

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

事实证明,通过仅归档 RootFolder 的内容(而不是文件夹本身),Amazon Beanstalk 识别了 ECS 任务定义文件。

希望这会有所帮助。

【讨论】:

    【解决方案2】:

    对我来说,这只是确保文件名与AWS documentation 中描述的大小写完全匹配的情况。

    dockerfile.aws.json 必须是 Dockerfile.aws.json

    【讨论】:

      【解决方案3】:

      类似的问题。为我解决的问题是使用 CLI 工具而不是自己压缩,只需运行 eb deploy 即可。

      【讨论】:

        【解决方案4】:

        对我来说,codecommit 不是。然后在 git 中添加 Dockerrun.aws.json 后它就可以工作了。

        【讨论】:

          【解决方案5】:

          由于错误,我来到了这里。我的问题是我使用标签进行部署:

          eb deploy --label MY_LABEL
          

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

          eb deploy --label 'MY_LABEL'
          

          【讨论】:

            【解决方案6】:

            我也遇到过这个问题。对我来说,问题是 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 目录。

            【讨论】:

              【解决方案7】:

              在我的例子中,我在创建 Dockerrun.aws.json 文件后没有提交它,所以使用 eb deploy 失败并出现同样的错误。

              【讨论】: