Второй пилот 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.