Запуск миграций на Dockerfile, развертывание на Elastic Beanstalk
У меня проблемы с миграцией (Django App 4.0.6) на Elastic beanstalk.
Это мой Dockerfile:
FROM python:3.8
ENV PROJECT_DIR=/usr/src/app/
ENV PYTHONIOENCODING=utf-8
ENV PYTHONDONTWRITEBYTECODE=1
ENV PYTHONUNBUFFERED=1
ENV PIPENV_USE_SYSTEM=1
WORKDIR ${PROJECT_DIR}
COPY . ./
RUN pip install -r requirements.txt
EXPOSE 8000
CMD ["python", "manage.py", "runserver", "0.0.0.0:8000"]
До этого момента все работает хорошо, но если я пытаюсь добавить RUN python manage.py migrate
перед EXPOSE 8000
и выполнить развертывание, у меня возникает 504 ошибка.
Я пытался добавить .ebextensions и файл конфигурации следующим образом:
container_commands:
01_migrate:
command: "source /var/app/venv/*/bin/activate && python3 manage.py migrate"
leader_only: true
Но я не уверен, как активировать мой env в Docker, у меня возникает ошибка, когда я пытаюсь сделать deploy
2022-08-01 03:10:23,328 P28507 [INFO] Command 01_migrate
2022-08-01 03:10:23,331 P28507 [INFO] -----------------------Command Output-----------------------
2022-08-01 03:10:23,331 P28507 [INFO] /bin/sh: /var/app/venv/*/bin/activate: No such file or directory
2022-08-01 03:10:23,331 P28507 [INFO] ------------------------------------------------------------
2022-08-01 03:10:23,331 P28507 [ERROR] Exited with error code 1
¿Какое лучшее решение для моего случая?
Спасибо за помощь! :)
Если вы не используете docker compose для развертывания, то вы можете добавить файл entrypoint и запустить миграции и команду сервера там.
# Dockerfile
...
RUN pip install -r requirements.txt
EXPOSE 8000
ENTRYPOINT ["bin/production-entrypoint.sh"]
где ваш bin/production-entrypoint.sh
файл выглядит примерно так:
#!/bin/bash
source /var/app/venv/*/bin/activate
python3 manage.py migrate
python manage.py runserver 0.0.0.0:8000
Или, если вы используете docker compose для развертывания, то вы можете выполнить команды в файле docker-compose.yml
:
# Dockerfile
...
RUN pip install -r requirements.txt
EXPOSE 8000
# docker-compose.yml
version: "3"
services:
web:
build: .
ports:
- "8000:8000"
env_file:
- .env
volumes:
- /var/app/current:/usr/src/app
command: >
bash -c "source /var/app/venv/*/bin/activate
&& python3 manage.py migrate
&& python manage.py runserver 0.0.0.0:8000
...