Второй пилот AWS с Django никогда не завершает развертывание

Я следил за этим кратким руководством по созданию приложения django с докером https://docs.docker.com/compose/django/

а затем следуйте инструкциям второго пилота по перемещению контейнера в ECS:https://aws.amazon.com/blogs/containers/introducing-aws-copilot/

Я также использовал этот образец для проверки всего - и он отлично работает: https://github.com/aws-samples/aws-copilot-sample-service. Развертывание завершается, выводит и конечную точку URL.

В моем случае все было успешно построено, но после развертывания тестовой среды она просто непрерывно строит:

72ff4719 size: 3055
⠏ Deploying load-bal:7158348 to test.

и никогда не заканчивается. Я даже сократил свой файл requirements.txt до минимума.

Мой Dockerfile

FROM python:3.7.4
ENV PYTHONUNBUFFERED=1
RUN mkdir /code
WORKDIR /code
COPY requirements.txt /code/
RUN pip install -r requirements.txt
EXPOSE 80
COPY . /code/

docker-compose.yml

version: "3.8"
   
services:
  db:
    image: postgres
    environment:
      - POSTGRES_DB=postgres
      - POSTGRES_USER=postgres
      - POSTGRES_PASSWORD=postgres
  web:
    build: .
    command: python manage.py runserver 0.0.0.0:8000
    volumes:
      - .:/code
    ports:
      - "8000:8000"
    depends_on:
      - db

requirements.txt

Django==3.0.8
djangorestframework==3.11.0
gunicorn==20.0.4
pipenv==2020.6.2
psycopg2-binary==2.8.5
virtualenv==16.7.6

Инструкции, которым я следую:

sudo docker-compose run web django-admin startproject composeexample .

Успешно создает приложение Django

copilot init

Настройка именования для приложения и балансировщика нагрузки

Выберите создание тестовой среды

Все строится успешно, а потом просто сидит здесь. Я пробовал несколько вариантов, но единственный, который работает, это просто выполнение инструктажа второго пилота без участия django.

6f3494a64128: Pushed 
cfe650cc4def: Pushed 
a477d6671cc7: Pushed 
90df760355a7: Pushed 
574ea6c52bdd: Pushed 
d1573fad78d1: Pushed 
14c1ff636882: Pushed 
48ebd1638acd: Pushed 
31f78d833a92: Pushed 
2ea751c0f96c: Pushed 
7a435d49206f: Pushed 
9674e3075904: Pushed 
831b66a484dc: Pushed 
ini: digest: sha256:b7460876bc84b1a26e7513fa6d17b5bffd5560ae958a933984376ed2c9fe53f3 size: 3052
⠏ Deploying aiinterview-lb:ini to test. 

1 ответ

tl;dr файл Dockerfile, который используется в этом руководстве, является неполным для целей Copilot. Требуется дополнительная строка, содержащая

CMD ["python", "manage.py", "runserver", "0.0.0.0:8000"]

и EXPOSE директиву следует обновить до 8000. Поскольку Copilot не распознает синтаксис Docker Compose и в файле Docker не указана команда или точка входа, образ никогда не будет запускаться с параметрами конфигурации Copilot.

Детали

AWS Copilot разработан вокруг "сервисов", состоящих из изображения, возможных дополнительных компонентов и дополнительных ресурсов хранения. Это означает, что его основной единицей конфигурации является образ Docker и манифест службы. Он изначально не читает синтаксис Docker Compose, поэтому вся конфигурация, о которой знает Copilot, - это та, которая указана в Dockerfile или образе и каждой службе. manifest.yml и addons каталог.

В этом примере, разработанном для использования с Docker Compose, Dockerfile не имеет CMD или же ENTRYPOINTдиректива, поэтому созданный образ, который Copilot отправляет в Amazon ECR, никогда не запустится. В руководстве указывается команда изображения (python manage.py runserver 0.0.0.0:8000) как переопределение в docker-compose.yml, поэтому вы захотите обновить свой Dockerfile до следующего:

FROM python:3.7.4
ENV PYTHONUNBUFFERED=1
RUN mkdir /code
WORKDIR /code
COPY requirements.txt /code/
RUN pip install -r requirements.txt
EXPOSE 8000
COPY . /code/
CMD ["python", "manage.py", "runserver", "0.0.0.0:8000"]

Обратите внимание, что я изменил EXPOSE директиве на 8000, чтобы соответствовать команде из docker-compose.yml и добавил команду, указанную в web в Dockerfile как CMD директива.

Вы также захотите запустить

copilot init --image postgres --name db --port 5432 --type "Backend Service" --deploy

Это создаст службу d b, указанную в вашем docker-compose.yml. Вам может потребоваться сначала запустить это, чтобы ваш веб-контейнер не запускался при поиске учетных данных.

Некоторые другие примечания:

  • Вы можете указать учетные данные своей базы данных, добавив variables и secrets в файле манифеста для db который создается в вашем рабочем пространстве по адресу ./copilot/db/manifest.yml. Для получения дополнительной информации о том, как добавить секрет в SSM и сделать его доступным для ваших служб Copilot, ознакомьтесь с нашей документацией.
variables: 
  POSTGRES_DB: postgres
  POSTGRES_USER: postgres

secrets:
  POSTGRES_PASSWORD: POSTGRES_PASSWORD
  • Конечная точка вашей базы данных доступна через обнаружение служб на db.$COPILOT_SERVICE_DISCOVERY_ENDPOINT- вам может потребоваться обновить код службы, который подключается к базе данных, чтобы отразить эту конечную точку вместо localhost или 0.0.0.0.
Другие вопросы по тегам