docker - docker-compose 在 ECS 上运行
问题描述
我一直在尝试将 Redash 设置为在 ECS 上运行。总的来说,我对 ECS 和 Docker 还很陌生,所以我不确定我到目前为止所做的工作是否缺少一些基本的东西。
到目前为止,我已经将Redash 的 docker-compose 文件转换为 AWS 容器定义。
但是,根据 Redash 文档,我需要先运行docker-compose run --rm server create_db
以在 Postgres 容器中设置表。
如何docker-compose run
在 ECS 上下文中实现此行为?
我注意到尝试通过向setup-postgres
我的容器定义中添加容器来强制执行此行为是可行的,但这是一种技巧,并不理想。
[
{
"name": "postgres-setup",
"image": "redash/redash:latest",
"cpu": 100,
"memory": 150,
"links": [
"postgres",
"redis"
],
"command": [
"create_db"
],
"environment": [
{
"name": "PYTHONUNBUFFERED",
"value": "0"
},
{
"name": "REDASH_LOG_LEVEL",
"value": "INFO"
},
{
"name": "REDASH_REDIS_URL",
"value": "redis://redis:6379/0"
},
{
"name": "REDASH_DATABASE_URL",
"value": "postgresql://postgres@postgres/postgres"
},
{
"name": "REDASH_COOKIE_SECRET",
"value": "veryverysecret"
},
{
"name": "REDASH_WEB_WORKERS",
"value": "1"
}
],
"essential": false
},
{
"name": "nginx",
"image": "redash/nginx:latest",
"essential": false,
"cpu": 100,
"memory": 200,
"links": [
"server:redash"
],
"portMappings": [
{
"containerPort": 80,
"hostPort": 80
}
]
},
{
"name": "postgres",
"image": "postgres:9.5.6-alpine",
"essential": true,
"cpu": 100,
"memory": 300,
"mountPoints": [
{
"sourceVolume": "mytestvol",
"containerPath": "/var/lib/postgresql/data"
}
]
},
{
"name": "redis",
"image": "redis:3.0-alpine",
"essential": true,
"cpu": 100,
"memory": 400
},
{
"name": "server",
"image": "redash/redash:latest",
"cpu": 100,
"memory": 400,
"links": [
"postgres",
"redis"
],
"command": [
"server"
],
"environment": [
{
"name": "PYTHONUNBUFFERED",
"value": "0"
},
{
"name": "REDASH_LOG_LEVEL",
"value": "INFO"
},
{
"name": "REDASH_REDIS_URL",
"value": "redis://redis:6379/0"
},
{
"name": "REDASH_DATABASE_URL",
"value": "postgresql://postgres@postgres/postgres"
},
{
"name": "REDASH_COOKIE_SECRET",
"value": "veryverysecret"
},
{
"name": "REDASH_WEB_WORKERS",
"value": "1"
}
],
"essential": false,
"portMappings": [
{
"containerPort": 5000,
"hostPort": 5000
}
]
},
{
"name": "worker",
"image": "redash/redash:latest",
"cpu": 100,
"memory": 400,
"links": [
"postgres",
"redis"
],
"command": [
"scheduler"
],
"environment": [
{
"name": "PYTHONUNBUFFERED",
"value": "0"
},
{
"name": "REDASH_LOG_LEVEL",
"value": "INFO"
},
{
"name": "REDASH_REDIS_URL",
"value": "redis://redis:6379/0"
},
{
"name": "REDASH_DATABASE_URL",
"value": "postgresql://postgres@postgres/postgres"
},
{
"name": "QUEUES",
"value": "queries,scheduled_queries,celery"
},
{
"name": "WORKERS_COUNT",
"value": "1"
}
],
"essential": false
}
]
我知道在这样的容器中运行 Postgres 并不理想,以后可能会将其移动到 RDS 中。如果我决定这样做,数据库初始化步骤会是什么样子?创建 ECS 实例,下载docker-compose.yml
文件并运行docker-compose run --rm server create_db
以在启动 ECS 服务之前进行一次性设置?
解决方案
你没有。
你在这里看到了这几个错误的方式:
1) Docker Compose 是一个开发工具,而不是生产工具。您可以在生产环境中使用compose 文件——但这将通过 Docker Swarm 使用,并且某些功能仅适用于 docker-compose,而其他功能仅适用于 Docker Swarm。
2) 话虽如此 - ECS 是一个协调器,这就是 Docker Swarm 是什么(这就是你想要的) - 所以在 ECS 上运行 Docker Swarm 完全没有实际意义。
您在这里要做的是创建一个 ECS 任务定义;这本质上是撰写文件的 ECS 版本。您设置映像、端口绑定、卷、容器链接等。
因此,您可以在这里选择是要在 ECS 中运行,还是要设置 Docker Swarm。
祝你好运!
推荐阅读
- excel - TRUE() 函数的优点
- vba - 在另一个工作表上搜索之前选择列并过滤内容
- python - 如何使用 Errbot 正确配置单元测试?
- java - 为什么 HashSet 对单个字母字符进行排序?
- cuda - 带有转换复制崩溃的 CUDA 推力设备指针
- mysql - SQL 返回每个唯一整数值的最小值
- asp.net-core - 绑定动作参数模型时 ValidationContext.set_DisplayName 中的 ArgumentNullException
- linux - crontab 无法识别命令
- kendo-ui - 角度的 Kendo UI - 网格移位单击以选择行
- discord - Discord.js - 设置频道描述