Развертывание с помощью zappa, проект Django в подпапке

Я новичок в Docker, AWS Lambda и Zappa, но безуспешно пытаюсь настроить проект.

Я подключаюсь к Docker (docker-compose run web bash), активирую среду, настраиваю учетные данные AWS и запускаю zappa init и zappa deploy. Однако после развертывания я получаю сообщение об ошибке (выполнение zappa tail):

ModuleNotFoundError: No module named 'project'

Я считаю, что это потому, что моя структура каталогов не является стандартной:

Dockerfile
zappa_settings.json
requirements.txt
project\
- manage.py
- root\
   - settings.py
   - wsgi.py
   - ...

Итак, мой проект django находится внутри папки project, так как мне не нравится, когда все файлы кидаются туда и смешиваются с другими файлами конфигурации.

Мой конфигурационный файл Zappa выглядит так:

{
    "dev": {
        "aws_region": "us-east-2",
        "django_settings": "project.root.settings",
        "profile_name": "default",
        "project_name": "task",
        "runtime": "python3.6",
        "s3_bucket": "bucket-name"
    }
}

И Докерфайл:

FROM lambci/lambda:build-python3.6

# Copy in your requirements file
ADD requirements.txt /requirements.txt

# Copy your application code to the container
RUN mkdir /code/
WORKDIR /code/
ADD . /code/

ENV PS1 'zappa@$(pwd | sed "s@^/var/task/\?@@")\$ '

ADD zappa_settings.json /var/task/zappa_settings.json

WORKDIR /var/task

RUN virtualenv /var/venv && \
    source /var/venv/bin/activate && \
    pip install -U pip zappa && \
    pip install -r /requirements.txt && \
    deactivate

CMD ["zappa"]

Не подскажете, как правильно настроить? Спасибо!

ОБНОВЛЕНИЕ:

Последняя ошибка после перехода в подпапку:

ModuleNotFoundError: нет модуля с именем root


person Diego Jancic    schedule 03.10.2017    source источник
comment
Как насчет того, чтобы переместить файлы Dockerfile, zappa_settings.json, requirements.txt в то же место, что и файл manage.py, и изменить конфигурацию zappa на "django_settings": "root.settings"?   -  person Beomi    schedule 04.10.2017
comment
Спасибо @Beomi. Имеет смысл. Тем не менее, я сделал это, и теперь я получаю ModuleNotFoundError: No module named 'root'. Я добавляю скриншот полной ошибки. Спасибо   -  person Diego Jancic    schedule 05.10.2017


Ответы (2)


Вы можете сохранить свою файловую структуру с помощью zappa, и она будет работать отлично.

Учитывая файловую структуру

Dockerfile
zappa_settings.json
requirements.txt
project\
- manage.py
- root\
   - settings.py
   - wsgi.py
   - ...

Вы можете упростить свой Dockerfile, чтобы он был

FROM lambci/lambda:build-python3.6

ADD . /var/task

RUN python -m venv /var/task/dockervenv && \
    source /var/task/dockervenv/bin/activate && \
    pip install -U pip zappa && \
    pip install -r /var/task/requirements.txt && \
    deactivate

WORKDIR /var/task

ENV PS1 'zappa@$(pwd | sed "s@^/var/task/\?@@")\$ '

CMD ["bash"]

И из вашего обновления кажется, что вы получили аналогичные результаты, потому что ваше приложение Django, похоже, достигает кода Django. Предположительно, вы также отредактировали свои ALLOWED_HOSTS, чтобы принять входящие подключения

Теперь ошибка ModuleNotFoundError: No module named 'root' связана с тем, что ваш файл настроек Django не должен существовать в подкаталоге. Вы должны обновить settings.py, чтобы обновить переменную

ROOT_URLCONF = 'project.root.urls'

Это должно заставить вас работать.

Побочные эффекты этого подхода с докером

Кроме того, то, как вы настраиваете свой док-контейнер, имеет некоторые последствия для рабочего процесса кодирования. Ваш образ докера будет содержать копию вашего кода на момент его сборки. Таким образом, любые изменения кода в работающем контейнере докеров будут потеряны, когда контейнер завершится, если они не будут экспортированы каким-либо образом (например, git). Хотя это может подойти для стабильного кода в конвейере CI/CD, я бы не рекомендовал его для активной разработки.

Если вы хотите использовать его для активной разработки, то при вызове докера ваш проект будет напрямую отображаться как том при вызове контейнера. Например:

docker run -ti -v $(pwd):/var/task --rm <name of your image>

person Edgar    schedule 05.10.2017
comment
Спасибо @Эдгар. Кажется, я уже пробовал это, и ошибка была No module named 'project', но я попробую еще раз. Что касается примечания «Побочный эффект», что бы вы порекомендовали? Просто не работаете с Docker? Поскольку я на Windows, я считаю, что у меня нет выбора, но я думаю, что мог бы просто перейти на Linux. - person Diego Jancic; 05.10.2017
comment
Диего, попробуйте это с обновленным файлом докера, который я вставил, и дайте мне знать, как это работает. - person Edgar; 06.10.2017

Просто переместите, zappa_settings.json и .json, сгенерированные zappa, разместятся в вашей подпапке.

Затем обновите zappa_settings.json: django_settings: project.root.settings --› django_settings: root.settings

cd в папку проекта и выполните обновление zappa dev.

Не лучшее решение, но мне помогло

person Alvaro Chévez    schedule 14.07.2021