【问题标题】:How to translate docker-compose.yml to Dockerrun.aws.json for Django如何为 Django 将 docker-compose.yml 翻译成 Dockerrun.aws.json
【发布时间】:2017-01-20 11:50:19
【问题描述】:

我正在按照https://docs.docker.com/compose/django/ 的说明来运行一个基本的 dockerized django 应用程序。我可以毫无问题地在本地运行它,但我无法使用 Elastic Beanstalk 将它部署到 AWS。在阅读了here 之后,我想我需要将 docker-compose.yml 翻译成 Dockerrun.aws.json 才能工作。

原来的docker-compose.yml是

version: '2'
services:
  db:
    image: postgres
  web:
    build: .
    command: python manage.py runserver 0.0.0.0:8000
    volumes:
      - .:/code
    ports:
      - "8000:8000"
    depends_on:
      - db

这是我目前翻译的内容

{
  "AWSEBDockerrunVersion": 2,
  "volumes": [
    {
      "name": "db"
    },
    {
      "name": "web"
    }
  ],
  "containerDefinitions": [
    {
      "name": "db",
      "image": "postgres",
      "essential": true,
      "memory": 256,
      "mountPoints": [
        {
          "sourceVolume": "db"
          "containerPath": "/var/app/current/db"
        }
      ]
    },
    {
      "name": "web",
      "image": "web",
      "essential": true,
      "memory": 256,
      "mountPoints": [
        {
          "sourceVolume": "web"
          "containerPath": "/var/app/current/web"
        }
      ],
      "portMappings": [
       {
         "hostPort": 8000,
         "containerPort": 8000
       }
     ],
     "links": [
        "db"
      ],
      "command": "python manage.py runserver 0.0.0.0:8000"
    }
  ]
}

但它不起作用。我做错了什么?

【问题讨论】:

    标签: django docker amazon-elastic-beanstalk docker-compose amazon-ecs


    【解决方案1】:

    我一直在努力了解Dockerrun 格式的来龙去脉。查看Container Transform:“转换 docker-compose、ECS 和 Marathon 配置”……这是救命稻草。以下是它为您的示例输出的内容:

    {
        "containerDefinitions": [
            {
                "essential": true,
                "image": "postgres",
                "name": "db"
            },
            {
                "command": [
                    "python",
                    "manage.py",
                    "runserver",
                    "0.0.0.0:8000"
                ],
                "essential": true,
                "mountPoints": [
                    {
                        "containerPath": "/code",
                        "sourceVolume": "_"
                    }
                ],
                "name": "web",
                "portMappings": [
                    {
                        "containerPort": 8000,
                        "hostPort": 8000
                    }
                ]
            }
        ],
        "family": "",
        "volumes": [
            {
                "host": {
                    "sourcePath": "."
                },
                "name": "_"
            }
        ]
    }
    Container web is missing required parameter "image".
    Container web is missing required parameter "memory".
    Container db is missing required parameter "memory".
    

    也就是说,在这种新格式中,您必须告诉它为每个容器分配多少内存。此外,您需要提供图像 - 没有构建选项。正如 cmets 中提到的,您想要构建并推送到 DockerHub 或 ECR,然后给它那个位置:例如 Dockerhub 上的[org name]/[repo]:latest,或者 ECR 的 URL。但是container-transform 会为您提供mountPointsvolumes - 这太棒了。

    【讨论】:

    • 感谢山姆 H! Container Transform 超级好用。
    • 注意:要摆脱“缺少必需的参数“内存””消息,请在 docker-compose.yml 中为每个服务添加 mem_limit XXXm
    • 这确实为我节省了数小时的痛苦和故障排除!
    【解决方案2】:

    你有一些问题。

    1) 'web' 似乎不是“图像”,您将其定义为 'build 。 ' 在您的 docker-compose 中。请记住,Dockerrun.aws.json 必须从某个地方提取图像(最简单的是使用 ECS 的存储库)

    2) 我认为“命令”是一个数组。所以你会有:

    "command": ["python" "manage.py" "runserver" "0.0.0.0:8000"]
    

    3) 您的 mountPoints 是正确的,但顶部的卷定义是错误的。 { “名称”:“网络”, “主持人”: { "sourcePath": "/var/app/current/db" } 我不是 100% 确定,但这条路对我有用。 如果您有 Dockerrun.aws.json 文件,旁边是一个名为 /db .. 的目录,那么这将是挂载位置。

    【讨论】:

    • 我使用 docker builddocker push 到 hub.docker.com 来实现 1),我认为你需要在 2) 的参数之间使用逗号。但它仍然无法正常工作......您能否分享适用于您的 Dockerrun.aws.json 以及适用于您的图像?
    猜你喜欢
    • 2018-05-16
    • 1970-01-01
    • 1970-01-01
    • 2019-09-28
    • 1970-01-01
    • 2021-11-22
    • 1970-01-01
    • 1970-01-01
    • 2011-03-09
    相关资源
    最近更新 更多