弹性豆茎需要 python 3.5

Posted

技术标签:

【中文标题】弹性豆茎需要 python 3.5【英文标题】:Elastic beanstalk require python 3.5 【发布时间】:2017-06-08 10:51:22 【问题描述】:

我最近使用最新的稳定版 python (3.5) 创建了一个新的 python 程序。不幸的是,AWS EB 不提供 3.5 基本映像。我一直在尝试配置 .ebextensions 以获取图像以升级 python 发行版,因为它是第一个操作。我没有成功。我尝试了以下方法:

packages:
    yum:
        postgresql93-devel: []
        python35: []

命令

container_commands:
      01_install_packages:
        command: 'yum install -y python35 python35-pip' 

container_commands的情况下,日志确实显示python 35安装成功。但是,我们的代码(在后续命令中)随后以只有在 python 版本 3.4 或更低版本的情况下才有可能失败。我假设虽然安装了 3.5 环境并没有切换到它作为源并继续使用 3.4 发行版。

我们不能手动修改环境,因为我们需要我们的配置为自动缩放做好准备。因此,解决方案必须来自.ebextensions 中的一些配置。这里的任何帮助将不胜感激。

更新

我收到一封来自 AWS 支持的电子邮件,通知我,由于操作系统和应用程序 python 环境是紧密耦合的(即相同),因此无法将应用程序的默认 python 版本更改为 python 3.5。他们建议我创建一个 docker 映像。我已经开始研究如何做到这一点。如果我想出一个解决方案,我会在这里发布。

【问题讨论】:

【参考方案1】:

我最终解决这个问题的方法是创建一个基于 python 的 docker 容器,并切换到使用弹性 beanstalk docker 配置。我包括下面的脚本来帮助人们。请注意,它不包含 uwsgi 或主管,因为它只是第一次通过。您可能需要根据自己的情况添加这些内容。

Dockerfile

FROM python:3.5

ADD . /src

RUN apt-get update
RUN apt-get install -y postgresql postgresql-contrib libpq-dev python3-dev
RUN pip3 install -r /src/requirements.txt
EXPOSE  8080
RUN python3 --version
CMD ["python3", "/src/application.py", "-p 8080"]

【讨论】:

【参考方案2】:

此解决方案适用于 06.06.2017,AMI 映像:ami-1871797e

在您的项目中,只需创建文件.ebextensions/00_python_version.config,内容如下:

packages:
  yum:
    postgresql94-devel: []
    postgresql95-devel: []
    libffi-devel: []
    python35: []
    python35-devel: []
    python35-libs: []
    mod24_wsgi-python35: []

files:
  "/temp/change_python.sh":
    mode: "000644"
    owner: root
    group: root
    content: |
      rm -rf /opt/python/run/venv
      virtualenv -p /usr/bin/python35 /opt/python/run/venv
      rm -rf /opt/python/run/baselinenv
      ln -sf /opt/python/run/venv /opt/python/run/baselinenv

files:
  "/temp/change_python_2.sh":
    mode: "000644"
    owner: root
    group: root
    content: |
      ln -sf /opt/python/run/venv/lib64/python3.5 /opt/python/run/venv/lib64/python3.4
      ln -sf /opt/python/run/venv/lib/python3.5 /opt/python/run/venv/lib/python3.4

commands:
  00_aws_change_python:
    command: "sh /temp/change_python.sh"

container_commands:
  00_aws_change_python_2:
    command: "sh /temp/change_python_2.sh"

【讨论】:

赞成,因为它准确地回答了这个问题,但是,我真的认为 docker 容器是更好的方法。修改 ebextension 配置有点像噩梦,因为 Amazon 不能让动态测试这些配置变得容易。我认为使用尽可能少的 ebextension foo 并在 dockerfile 中使用配置会更容易。

以上是关于弹性豆茎需要 python 3.5的主要内容,如果未能解决你的问题,请参考以下文章

如何在弹性豆茎上更新 python Flask 应用程序?

让 peewee 在弹性豆茎上工作

aws 弹性豆茎“请求 URI 太长”

在弹性豆茎中设置静态文件

在弹性豆茎上创建环境时出现 502

无法在弹性豆茎上加载带有瓶子的静态文件