【问题标题】:Docker on AWS Elastic Beanstalk - can't access environment variables from containerAWS Elastic Beanstalk 上的 Docker - 无法从容器访问环境变量
【发布时间】:2018-10-19 13:36:22
【问题描述】:

我尝试将我们的 Python/Django 应用程序移至 AWS Elastic Beanstalk 上的 Docker(单个 Docker 容器)。我写了一个基本的Dockerfile 如下,从各种教程中拼凑而成:

FROM python:3

ENV PYTHONUNBUFFERED 1
RUN mkdir /var/app
WORKDIR /var/app
ADD requirements.txt /var/app
RUN pip install -r requirements.txt
ADD . /var/app
EXPOSE 8000

RUN python3 manage.py migrate --settings=finimize_django.settings.aws --noinput


CMD python3 manage.py runserver --settings=finimize_django.settings.aws

这在migrate RUN 命令之前构建良好,此时应用程序出错,因为它无法从 EB UI 中找到环境变量。

我注意到有一个示例 AWS 图像 here,我不想使用它(出于多种原因,例如简单、能够在本地使用类似图像、想要控制等)。查看这个使用的 Dockerfile,我也看不出他们是如何解决这个问题的。

有什么我错过的吗?

【问题讨论】:

    标签: python docker amazon-elastic-beanstalk dockerfile


    【解决方案1】:

    我最终怀疑这里出了什么问题 - 我认为您无法访问 env var,除非您处于构建阶段(即不能在 RUN 命令中,除非您以 ONBUILD 开头)。

    为了解决这个问题,我将我的 manage.py 命令移到了一个 bash 脚本中,我将其用作入口点:

    FROM python:3
    
    ENV PYTHONUNBUFFERED 1
    WORKDIR /var/app
    
    RUN pip3 install virtualenv
    RUN virtualenv /var/app
    
    ADD . /var/app
    
    EXPOSE 8000
    
    RUN ["chmod", "+x", "/var/app/scripts/aws_start.sh"]
    ENTRYPOINT [ "/var/app/scripts/aws_start.sh" ]
    

    然后在我的aws_start.sh 我有:

    cd /var/app
    
    . bin/activate
    
    pip install -r requirements.txt
    
    python3 manage.py createsu --settings=finimize_django.settings.aws
    python3 manage.py migrate --settings=finimize_django.settings.aws --noinput
    python3 manage.py runserver --settings=finimize_django.settings.aws
    

    这似乎工作正常

    【讨论】:

      【解决方案2】:

      这是我目前用于生产实例的小型单个应用程序 eb 部署的小型工作 docker 文件的示例。

      关于环境变量的一点确保它们是在容器或 .env 文件中定义的。

      下面的示例使用 gunicorn 并在端口 80 上运行。您需要为 db/cache/email/other 输入 ENV 变量。此外,还要确保您设置了正确的安全组,以授权 EB 访问您的 RDS。

      需要说明的是,您不应该在每个 EB 部署上都运行迁移/迁移。我建议单独运行它们并在执行之前对其进行测试,因为迁移错误/错误会严重破坏您的生产/开发服务器,这是您不想要的。

              FROM python:3.6
      
          RUN apt-get update && \
              apt-get -y install libev-dev gcc gcc+ python3-dev g++ && \
              rm -rf /var/lib/apt/lists/*
      
      
              WORKDIR /app
              ADD . /app
              RUN pip install --trusted-host pypi.python.org -r requirements.txt
      
          ENV DJANGO_ALLOWED_HOSTS *
          ENV DJANGO_SETTINGS_MODULE config.settings.production
      
          EXPOSE 80
          ENTRYPOINT ["python", "/usr/local/bin/gunicorn", "config.wsgi", "-b 0.0.0.0:80" ,"-w=3", "--chdir=/app"]
      

      【讨论】:

      • 关于迁移命令的要点。您是在每次部署迁移的变量时手动运行它 - 还是只是建议先部署到测试环境?
      • 如果在部署期间需要,我会手动运行。因为我想处理从 makemigrations 收到的错误,因为它们发生了。我通常也会在之前的分期中对其进行测试。我还强调设计我的模型,以便尽可能避免迁移失败。但你永远不会知道,尤其是在与第三方库集成时。您最不想做的就是遇到一些任意迁移错误并破坏您的生产。
      【解决方案3】:

      根据AWS documentation for elastic beanstalk Python platform,可以通过 Python 的 os.environ 字典访问环境属性。欲了解更多信息,请转至http://docs.python.org/library/os.html

      有关在 Elastic Beanstalk 中设置环境属性的一般信息可以是found here

      尝试使用这两个指南来更改设置文件的编写方式,以使 migrate RUN 语句正常工作。

      如果这些不能为您提供所需的线索,请在您的问题中发布确切的错误消息以及设置文件中的行,我们也许可以更好地帮助您。也是访问设置的目标(数据库连接信息、密钥等)

      【讨论】:

        猜你喜欢
        • 2015-08-05
        • 2017-12-26
        • 1970-01-01
        • 2015-04-02
        • 2016-12-10
        • 2016-10-24
        • 2016-04-20
        • 2015-06-08
        相关资源
        最近更新 更多