在子文件夹中部署zappa、Django项目

在子文件夹中部署zappa、Django项目,django,aws-lambda,zappa,Django,Aws Lambda,Zappa,我是Docker、AWS Lambda和Zappa的新手,但我正在尝试配置一个几乎没有成功的项目 我连接到Docker(Docker compose运行web bash),激活环境,配置AWS凭据并运行zappa init和zappa deploy。但是,在部署之后,我得到一个错误(执行zappa tail): 我认为这是因为我的dir结构不是标准的: Dockerfile zappa_settings.json requirements.txt project\ - manage.py - r

我是Docker、AWS Lambda和Zappa的新手,但我正在尝试配置一个几乎没有成功的项目

我连接到Docker(
Docker compose运行web bash
),激活环境,配置AWS凭据并运行
zappa init
zappa deploy
。但是,在部署之后,我得到一个错误(执行
zappa tail
):

我认为这是因为我的dir结构不是标准的:

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"]
你能告诉我如何正确设置它吗?谢谢

更新:

移动到子文件夹后的最新错误:


您可以使用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代码。想必你也有

现在出现错误
ModuleNotFoundError:没有名为“root”的模块
,因为您的Django设置文件不希望存在于子目录中。必须更新
设置.py
才能更新变量

ROOT_URLCONF = 'project.root.urls'
这会让你振作起来

这种docker方法的副作用

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

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


docker run-ti-v$(pwd):/var/task--rm

如何移动
Dockerfile
zappa\u settings.json
requirements.txt
文件到与
manage.py
文件相同的位置,并将zappa配置更改为
“django\u设置”:“root.settings”
?谢谢@Beomi。有道理。然而,我这样做了,现在我得到了
ModuleNotFoundError:没有名为'root'的模块
。我正在添加一个完整错误的屏幕显示。谢谢你,谢谢埃德加。我相信我已经试过了,错误是
没有名为'project'的模块
,但我会再试一次。至于“副作用”说明,你有什么建议?只是不跟Docker合作?因为我在Windows上,我相信我别无选择,但我想我可以转移到Linux.Diego,用我粘贴的更新docker文件试试,让我知道它是如何运行的。
ROOT_URLCONF = 'project.root.urls'