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 并记录到文件