如何设置运行 Django 的 AWS Elastic Beanstalk Docker 平台?

Posted

技术标签:

【中文标题】如何设置运行 Django 的 AWS Elastic Beanstalk Docker 平台?【英文标题】:How do you setup an AWS Elastic Beanstalk Docker Platform running Django? 【发布时间】:2015-07-12 15:58:59 【问题描述】:

我一直在使用常规 EB Python 平台运行常规 Django 站点,但由于某些原因,我想迁移到使用 Docker 映像,但仍然可以从 Elastic Beanstalk 获得一切。 为了演示这个问题,我在https://github.com/dkarchmer/aws-eb-docker-django 创建了一个小型 Django 项目,它适用于 Python 2.7 和 3.4,它是我真实站点的简化版本。 无论如何,我很乐意让它与预配置的 Docker 平台或通用 Docker 平台一起工作。 我的 Google 搜索只找到了 AWS 展示的超级简单、基于 Flask 的示例,以及 *** 上的几个问题,但似乎没有人试图将 Django 项目放在 EB/Docker 上。 无论如何,让我们从一个通用的解决方案开始,这是我的首选。 如果你下载了 Github 项目,你可以成功地使用 docker(或者更好的 docker-sompose)来测试镜像在本地运行时是否正常工作(我在 MacOS 上运行)。 目前尚不清楚我是否应该使用 CMD 来定义我的“python manage.py runserver”,或者我是否需要一个 ENTRYPOINT,或者我是否需要使用 uswgi(就像预配置的解决方案一样)。 我相信我需要一个 CMD,所以这就是我正在做的事情:

  FROM python:3.4

  RUN adduser --disabled-password --gecos '' myuser

  # Install PostgreSQL dependencies
  # Install Postgres
  RUN apt-get update && apt-get install -y \
        postgresql-9.3 \
        libpq-dev \
        libjpeg-dev; \
        apt-get clean

 # Step 1: Install any Python packages
 # ----------------------------------------

 RUN mkdir /var/app
 WORKDIR  /var/app
 COPY requirements.txt /var/app/
 RUN pip install -r requirements.txt

 # Step 2: Copy Django Code
 # ----------------------------------------

 COPY authentication /var/app/authentication
 COPY myproject /var/app/myproject
 COPY settings /var/app/settings
 COPY manage.py /var/app/

 ENV DJANGO_SETTINGS_MODULE=settings.production

 EXPOSE 8080

 WORKDIR  /var/app
 CMD ["python", "/var/app/manage.py", "runserver", "0.0.0.0:8080"]

您可以在上面的 Github 链接中查看(下载并尝试)代码。

当我部署时(参见 fabfile.py 中的fab eb_create_custom),我得到

[2015-05-02T15:22:27.245Z] INFO  [1732]  - [CMD-Startup/StartupStage0/AppDeployPreHook/04run.sh] : Activity execution failed, because: 17212f02bce509d43c40eeac9f53a281eecf1502387dac69c096c337c9c7b186
 Docker container quit unexpectedly after launch: Docker container quit unexpectedly on Sat May  2 15:22:27 UTC 2015:
 python3: can't open file 'manage.py': [Errno 2] No such file or directory. Check snapshot logs for details. (ElasticBeanstalk::ExternalInvocationError) caused by: 17212f02bce509d43c40eeac9f53a281eecf1502387dac69c096c337c9c7b186

我已经确认 manage.py 文件在那里。除了上面的错误,我已经下载了完整的日志,看不到太多。

有内幕吗?有人知道在 EB Docker 上运行 Django 的示例吗?

谢谢

【问题讨论】:

更多内容。如果我通过 SSH 连接到机器并在 docker 映像上运行 bash,并尝试手动运行 python manage.py runserver,我会得到KeyError: 'RDS_DB_NAME',它告诉我 EB 没有像在 python 平台上那样设置这些变量,或者它在命令行上执行。但是我将尝试对其进行硬编码以查看会发生什么,但如果是这样的话,那将是一件痛苦的事情,因为 EB 正在创建 RDS 数据库,而我事先并不知道这些信息。 【参考方案1】:

我仍然没有可用的自定义 Docker 映像,但预配置的 Python Docker 版本可以正常工作:

https://github.com/dkarchmer/aws-eb-preconfigured-docker-django

【讨论】:

【参考方案2】:

我终于找到了问题。

问题在于,在 Dockerrun.aws.json 文件中,我将主机目录映射(使用“卷”)到 /var/app 容器目录,这恰好是我所在的位置 COPY-ing 项目到。这基本上是覆盖和替换所有项目文件。这就是为什么 docker 镜像在我的本地机器上运行(因为本地不需要此文件)但在发布到 AWS 时失败。

因为我不需要交叉映射这些卷,所以我只需删除 Dockerrun.aws.json 中的“Volumes”条目即可解决问题。

我已经清理并发布了一个工作版本以供其他人使用:

https://github.com/dkarchmer/aws-eb-docker-django

【讨论】:

以上是关于如何设置运行 Django 的 AWS Elastic Beanstalk Docker 平台?的主要内容,如果未能解决你的问题,请参考以下文章

如何解决 AWS Elastic Beanstalk Django 运行状况检查问题

如何使 django 项目与 AWS Beanstalk 兼容?

如何通过 eb cli (django postgres) 迁移 AWS RDS 数据库?

如何将 Django Fixtures 部署到 Amazon AWS

如何在 AWS Elastic Beanstalk 上运行 celery worker?

部署到 AWS 服务器时 django 应用程序的 CSRF 令牌错误