我按照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"
}
]
}
但它不起作用。我做错了什么?
答案 0 :(得分:13)
我正在努力获得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".
也就是说,在这种新格式中,您必须告诉它分配每个容器的内存量。此外,您需要提供图像 - 没有选项可以构建。正如评论中提到的,您希望构建并推送到DockerHub或ECR,然后将其提供给该位置:例如Dockerhub上的[org name]/[repo]:latest
或ECR的URL。但是container-transform
会为你做mountPoints
和volumes
- 这太棒了。
答案 1 :(得分:2)
你有一些问题。
1)' web'并不是一个'图像',您将其定义为' build。 '在您的docker-compose中。请记住,Dockerrun.aws.json必须从某处提取图像(最简单的方法是使用ECS' s存储库)
2)我认为'命令'是一个数组。所以你有:
"command": ["python" "manage.py" "runserver" "0.0.0.0:8000"]
3)你的mountPoints是正确的,但顶部的卷定义是错误的。 { " name":" web", "主持人":{ " sourcePath":" / var / app / current / db" } 我不是100%肯定,但这条路对我有用。 如果你有Dockerrun.aws.json文件,旁边是一个名为/ db ..的目录,那么这将是挂载位置。