使用zappa进行部署,Django项目在子文件夹中

时间:2017-10-03 23:03:58

标签: django aws-lambda zappa

我是Docker,AWS Lambda和Zappa的新手,但我正在尝试配置项目,但收效甚微。

我连接到Docker(docker-compose run web bash),激活环境,配置AWS凭据并运行zappa initzappa 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"
    }
}

和Dockerfile:

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: No module named root

2 个答案:

答案 0 :(得分:1)

您可以使用zappa保留文件结构,它可以正常工作。

给定文件结构

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"] 简化为

ModuleNotFoundError: No module named 'root'

从你的更新看来,你得到了类似的结果,因为你的Django应用程序似乎达到了Django代码。大概你也有edited your ALLOWED_HOSTS to accept incoming connections

现在错误settings.py是因为您的Django设置文件不希望存在于子目录中。您必须更新ROOT_URLCONF = 'project.root.urls' 以更新变量

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

这应该让你起步并运行。

此泊坞窗方法的副作用

另外,设置docker容器的方式对编码工作流程有一些影响。您的docker镜像将在构建时包含代码的副本。因此,当容器结束时,对正在运行的docker容器中的代码的任何编辑都将丢失,除非以某种方式导出(例如git)。虽然这对于CI / CD管道中的稳定代码来说非常好,但我不建议将其用于主动开发。

如果您想将其用于主动开发,那么在调用docker时,请在调用容器时将项目直接映射为卷。例如:

{{1}}

答案 1 :(得分:0)

移动即可,zappa_settings.json 和 zappa 生成的 .json 部署到您的子文件夹中。

然后更新 zappa_settings.json: "django_settings": "project.root.settings" --> "django_settings": "root.settings"

cd 进入项目文件夹并执行 zappa update dev。

不是最好的解决方案,但对我有用