AWS:Docker Compose项目的CodeDeploy?

Dan*_*n K 5 django amazon-ec2 amazon-web-services travis-ci docker-compose

我目前的目标是让Travis在我们的Git master分支成功合并拉取请求后部署我们的Django + Docker-Compose项目.我已经完成了一些设置我们的AWS CodeDeploy的工作,因为Travis已经内置了对它的支持.当我到达AppSpec和实际部署部分时,首先我尝试使用AfterInstall脚本docker-compose build,然后使用ApplicationStart脚本docker-compose up.从Web中提取图像的容器是我们的PostgreSQL容器(命名为dbimage aidanlister/postgres-hstore,这是通常的postgres图像加上hstore扩展名),Redis容器(使用redis图像)和Selenium容器(图像selenium/standalone-firefox).其他两个容器,web以及worker,分别Django的服务器和芹菜工作者,使用相同的Dockerfile构建的图像.主要命令是:

CMD paver docker_run
Run Code Online (Sandbox Code Playgroud)

它使用一个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')
Run Code Online (Sandbox Code Playgroud)

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

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

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

Dan*_*n K 9

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

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

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

此外,部署的最后阶段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 &
Run Code Online (Sandbox Code Playgroud)

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

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