AWS:Docker Compose项目的CodeDeploy?

时间:2016-01-07 18:20:59

标签: django amazon-web-services amazon-ec2 travis-ci docker-compose

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

worker

使用CMD paver docker_run 文件:

pavement.py

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

  1. 使用CodeDeploy让Travis部署更改,基于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') 为我们的CodeDeploy设置量身定制的deploy部分
  2. 使用我们的.travis.yml
  3. 成功部署后,在AWS上启动我们的Docker容器

    如何实现第二步?我很确定ECS实际上并不是这里所需要的。我目前的状态是我可以使用docker-compose.yml启动Docker,但我无法让sudo service docker start成功。尽管部署报告为“成功”,但这仅仅是因为docker-compose up命令在后台运行的Validate Service部分脚本中运行。实际上,当我尝试在ssh进入EC2实例时手动执行docker-compose up时,我就陷入了构建其中一个容器的困境,就在Dockerfile的docker-compose up部分之前。

1 个答案:

答案 0 :(得分:8)

这需要很长时间才能完成,但我终于找到了一种方法,可以在没有Docker-Machine或ECS的情况下使用CodeDeploy部署Django + Docker-Compose项目。

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

在进行必要的Docker安装和设置(包括安装Docker-Compose)时,让After Install脚本运行service docker start非常重要。这是显式开始运行Docker守护程序 - 如果没有此命令,您将收到错误Could not connect to Docker daemon。安装Docker-Compose时,务必将其放在/opt/bin/中,以便通过/opt/bin/docker-compose使用二进制文件。将它放在/usr/local/bin中有问题(我不完全记得有什么问题,但它与Amazon Linux AMI的特定Linux发行版有关)。需要以root身份运行After Install脚本(runas: root AfterInstall部分中的appspec.yml

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

/dev/null

否则,一旦服务器启动,部署就会挂起,因为最终的脚本命令(在我的/opt/bin/docker-compose -f docker-compose-aws.yml up -d > /dev/null 2> /dev/null < /dev/null & 的ApplicationStart部分中)不会退出。在默认部署超时1小时后,这可能会导致部署失败。

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