我目前的目标是让Travis在我们的Git master分支成功合并拉取请求后部署我们的Django + Docker-Compose项目.我已经完成了一些设置我们的AWS CodeDeploy的工作,因为Travis已经内置了对它的支持.当我到达AppSpec和实际部署部分时,首先我尝试使用AfterInstall脚本docker-compose build
,然后使用ApplicationStart脚本docker-compose up
.从Web中提取图像的容器是我们的PostgreSQL容器(命名为db
image aidanlister/postgres-hstore
,这是通常的postgres
图像加上hstore扩展名),Redis容器(使用redis
图像)和Selenium容器(图像selenium/standalone-firefox
).其他两个容器,web
以及worker
,分别Django的服务器和芹菜工作者,使用相同的Dockerfile构建的图像.主要命令是:
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')
以下是我(我想)每次合并拉取请求时需要做的事情:
让Travis使用CodeDeploy部署更改,基于为CodeDeploy设置量身定制的deploy
部分.travis.yml
使用我们的成功部署后,在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 的一部分之前就陷入了构建其中一个容器的困境.
这需要很长时间才能完成,但我终于找到了一种方法,可以在没有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: root
在appspec.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小时后,这可能会导致部署失败.
如果一切顺利,那么最终可以在浏览器中的实例的公共DNS和端口访问该站点.