AWS Elastic Beanstalk 上的 Docker - 无法从容器访问环境变量

Posted

技术标签:

【中文标题】AWS Elastic Beanstalk 上的 Docker - 无法从容器访问环境变量【英文标题】:Docker on AWS Elastic Beanstalk - can't access environment variables from container 【发布时间】: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,我也看不出他们是如何解决这个问题的。

有什么我错过的吗?

【问题讨论】:

【参考方案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 语句正常工作。

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

【讨论】:

以上是关于AWS Elastic Beanstalk 上的 Docker - 无法从容器访问环境变量的主要内容,如果未能解决你的问题,请参考以下文章

如何避免 AWS Elastic Beanstalk 上的 TooManyApplicationVersion 异常?

反应:AWS Elastic Beanstalk 上的 502 错误网关

AWS Elastic Beanstalk 上的 Wordpress

AWS Elastic Beanstalk 上的 Spring Boot 并记录到文件

AWS Elastic Beanstalk 上的 Django manage.py

如何获取命令以从 Elastic Beanstalk 上的 Dockerfile.aws.json 运行?