AWS:Docker Compose 项目的 CodeDeploy?

AWS: CodeDeploy for a Docker Compose project?

我目前的 objective 是让 Travis 在成功合并拉取请求到我们的 Git 主分支后部署我们的 Django+Docker-Compose 项目。我已经完成了一些设置我们的 AWS CodeDeploy 的工作,因为 Travis 内置了对它的支持。当我到达 AppSpec 和实际部署部分时,起初我尝试让 AfterInstall 脚本执行 docker-compose build,然后让 ApplicationStart 脚本执行 docker-compose up。从网络上提取图像的容器是我们的 PostgreSQL 容器(名为 db,图像 aidanlister/postgres-hstore 这是通常的 postgres 图像加上 hstore 扩展),Redis 容器(使用 redis 图片)和 Selenium 容器(图片 selenium/standalone-firefox)。另外两个容器webworker,分别是Django服务器和Celery worker,使用相同的Docker文件来构建镜像。主要命令是:

CMD paver docker_run

使用 pavement.py 文件:

from paver.easy import task
from paver.easy import sh

@task
def docker_run():
    migrate()
    collectStatic()
    updateRequirements()
    startServer()

@task
def migrate():
    sh('./manage.py makemigrations --noinput')
    sh('./manage.py migrate --noinput')

@task
def collectStatic():
    sh('./manage.py collectstatic --noinput')

# find any updates to existing packages, install any new packages
@task
def updateRequirements():
    sh('pip install --upgrade -r requirements.txt')

@task
def startServer():
    sh('./manage.py runserver 0.0.0.0:8000')

这是我(认为我)每次合并拉取请求时需要做的事情:

  1. 让 Travis 使用 CodeDeploy 部署更改,基于 .travis.yml 中针对我们的 CodeDeploy 设置量身定制的 deploy 部分
  2. 使用我们的 docker-compose.yml
  3. 成功部署后,在 AWS 上启动我们的 Docker 容器

如何实现第二步?我很确定 ECS 实际上不是这里所需要的。我现在的状态是 Docker 可以从 sudo service docker start 开始,但我无法 docker-compose up 成功。尽管部署报告为 "successful",但这只是因为 docker-compose up 命令在后台的验证服务部分脚本中是 运行。事实上,当我尝试在 ssh 进入 EC2 实例时手动执行 docker-compose up 时,我在构建其中一个容器时卡住了,就在 Docker 文件的 CMD paver docker_run 部分之前。

这花了很长时间才弄明白,但我终于想出了一种方法,可以在没有 Docker-Machine 或 ECS 的情况下使用 CodeDeploy 部署 Django+Docker-Compose 项目。

一件重要的事情是制作一个排除 selenium 容器的替代 docker-compose.yml——它所做的只是导致问题,并且只对本地测试有用。此外,选择可以处理构建容器的实例类型也很重要。无法从我们的 Docker 文件构建容器的原因是实例根本没有内存来完成构建。代替 t1.micro 实例,m3.medium 是有效的。有足够的磁盘也很重要 space--8GB 太小了。为了安全起见,256GB 是最理想的。

在进行必要的 Docker 安装和设置(包括安装 Docker-Compose)时,安装后脚本 运行 service docker start 很重要。这是为了显式启动 运行 宁 Docker 守护进程——如果没有此命令,您将收到错误 Could not connect to Docker daemon。安装 Docker-Compose 时,重要的是将它放在 /opt/bin/ 中,以便通过 /opt/bin/docker-compose 使用二进制文件。将它放在 /usr/local/bin 中有问题(我不完全记得是什么问题,但它与亚马逊 Linux AMI 的特定 Linux 发行版有关)。安装后脚本需要作为 root 运行(runas: rootappspec.yml AfterInstall 部分)。

此外,部署的最后阶段,即使用 docker-compose up(更具体地说 /opt/bin/docker-compose -f docker-compose-aws.yml up)启动容器,需要在后台使用 stdin 和 stdout 运行重定向到 /dev/null:

/opt/bin/docker-compose -f docker-compose-aws.yml up -d > /dev/null 2> /dev/null < /dev/null &

否则,一旦服务器启动,部署将挂起,因为最终脚本命令(在我的 appspec.yml 的 ApplicationStart 部分)没有退出。这可能会导致在默认部署超时 1 小时后部署失败。

如果一切顺利,那么最终可以在您的浏览器中通过实例的 public DNS 和端口访问该站点。