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

How do you setup an AWS Elastic Beanstalk Docker Platform running Django?

我一直在 运行使用常规 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 的示例,以及关于 Whosebug 的几个问题,但似乎几乎没有人试图将 Django 项目放在 EB/Docker 上。 无论如何,让我们从通用解决方案开始,这是我的首选。 如果您下载 Github 项目,您可以成功地使用 docker(或更好,docker-sompose)来测试图像在本地 运行 时是否有效(我是 运行ning 在 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 link处的代码。

当我部署时(参见 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 文件存在。我已经下载了完整的日志,除了上面的错误之外,看不到太多。

有内幕吗?任何人都知道 运行ning Django on EB Docker?

的示例

谢谢

我仍然没有工作的自定义 Docker 图像,但是预配置的 Python Docker 版本工作:

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

终于找到问题了

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

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

我已经清理并发布了一个工作版本供其他人使用,希望能找到有用的东西:

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