使用docker composer在AWS beanstalk上部署docker

时间:2016-06-13 16:23:35

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

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

我所知道的:

  1. 我知道我必须选择部署为多容器泊坞窗。
  2. 管理多个node.js服务的最佳做法是使用docker composer。
  3. 我需要dockerrun.aws.json用于node.js app。
  4. 我需要为该ecs实例创建任务定义。
  5. 我遇到问题:

    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中运行任务,但它立即停止了。如何查看日志以查找任务?
    4. 我得到了:

        

      在环境

      中找不到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"
      }
      

7 个答案:

答案 0 :(得分:8)

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

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

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

希望这有帮助。

答案 1 :(得分:1)

类似的问题。为我修复的是使用CLI工具而不是自己压缩,只需运行eb deploy工作。

答案 2 :(得分:1)

对我来说,只是确保文件名与AWS documentation中所述的确切外壳相匹配。

dockerfile.aws.json必须完全Dockerfile.aws.json

答案 3 :(得分:0)

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

答案 4 :(得分:0)

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

eb deploy --label MY_LABEL

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

eb deploy --label 'MY_LABEL'

答案 5 :(得分:0)

我也遇到了这个问题。对我来说,问题是git中没有添加Dockerrun.aws.json。 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目录。

答案 6 :(得分:0)

就我而言,创建Dockerrun.aws.json文件后我没有提交它,因此使用eb deploy失败并出现相同的错误。