Запуск миграций на 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

...
Вернуться на верх