2

Моя нынешняя задача - заставить Travis развернуть наш проект Django + Docker-Compose при успешном объединении запроса на растяжение к нашей ветке Git master. Я проделал определенную работу по созданию нашего 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). Остальные два контейнера, web и worker, которые являются сервером Django и рабочим Celery, соответственно, используют один и тот же файл Docker для создания изображения. Основная команда:AWS: CodeDeploy для проекта Docker Compose?

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 на основе deploy раздел в .travis.yml с учетом нашей установки CodeDeploy
  2. Начните наши контейнеры Docker на AWS после успешного развертывания, используя наш docker-compose.yml

Как сделать этот второй шаг? Я уверен, что ECS на самом деле не то, что здесь нужно. Текущий статус сейчас - то, что я могу получить Docker с sudo service docker start, но я не могу получить docker-compose up, чтобы быть успешным. Хотя развертывания сообщаются как «успешные», это происходит только потому, что команда docker-compose up выполняется в фоновом режиме в сценарии раздела службы проверки. Фактически, когда я пытаюсь сделать docker-compose up вручную, когда ssh'd в экземпляр EC2, я застрял, строя один из контейнеров, прямо перед частью файла Docker CMD paver docker_run.

ответ

3

Это заняло много времени, чтобы поработать, но я, наконец, выяснил способ развертывания проекта Django + Docker-Compose с помощью CodeDeploy без Docker-Machine или ECS.

Одна вещь, которая была важна, заключалась в том, чтобы сделать альтернативный docker-compose.yml, который исключил контейнер selenium - все, что он сделал, вызывало проблемы и было полезно только для локального тестирования. Кроме того, важно было выбрать тип экземпляра, который мог бы обрабатывать контейнеры для сборки. Причина, по которой контейнеры не могли быть построены из нашего файла Docker, заключалась в том, что экземпляр просто не имел памяти для завершения сборки. Вместо экземпляра t1.micro работает m3.medium. Также важно иметь достаточное дисковое пространство - 8 ГБ слишком мало. Чтобы быть в безопасности, 256 ГБ были бы идеальными.

При выполнении установки и установки 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 (я точно не помню, какие проблемы, но это связано с конкретным дистрибутивом Linux для AMI Amazon Linux). Сценарий After Install должен запускаться с правами root (runas: root в разделе appspec.yml AfterInstall).

Кроме того, заключительный этап развертывания, который запускается контейнерами с docker-compose up (более конкретно /opt/bin/docker-compose -f docker-compose-aws.yml up), должен быть запущен в фоновом режиме с стандартным вводом и стандартным выводом перенаправлен /dev/null:

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

В противном случае, после запуска сервера развертывание будет зависать, потому что окончательная команда сценария (в разделе ApplicationStart моего appspec.yml в моем случае) не завершается. Вероятно, это приведет к отказу развертывания после истечения времени развертывания по умолчанию 1 час.

Если все пойдет хорошо, то, наконец, сайт может быть доступен в общедоступном DNS-сервере экземпляра и в вашем браузере.