1

我是 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:没有名为 root 的模块

4

2 回答 2

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'

这应该让你启动并运行。

这种 docker 方法的副作用

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

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

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

于 2017-10-05T15:57:44.733 回答
0

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

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

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

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

于 2021-07-14T18:36:03.260 回答