如何设置运行 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 平台?的主要内容,如果未能解决你的问题,请参考以下文章