我试图在AWS Elastic Beanstalk(单个Docker容器)上将我们的Python / Django应用程序移动到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,我看不出他们是如何解决这个问题的。
有没有我错过的东西?
答案 0 :(得分:0)
根据AWS documentation for elastic beanstalk Python platform,可以通过Python的os.environ字典访问环境属性。有关更多信息,请转到http://docs.python.org/library/os.html。
有关在Elastic Beanstalk中设置环境属性的一般信息可以是found here。
尝试使用这两个指南来更改设置文件的编写方式,以使迁移RUN语句生效。
如果这些没有为您提供所需的线索,请在您的问题中发布确切的错误消息以及设置文件中的行,我们可能会更好地为您提供帮助。此外,访问设置的目标(数据库连接信息,密钥等)
答案 1 :(得分:0)
以下是我目前用于生产实例的小型单个应用程序部署的小型工作泊坞窗文件的示例。
关于环境变量的一点是确保它们在容器或.env文件中定义。
下面的示例使用gunicorn并在端口80上运行。您需要为db / cache / email / other输入ENV变量。此外,还要确保您具有正确的安全组设置,以便对您的RDS进行EB访问。
要说明的一点是,您不应该在每个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"]
答案 2 :(得分:0)
我最终怀疑这里出了什么问题 - 我不认为你可以访问env vars,除非你处于构建阶段(即不在RUN
命令中,除非你在前面加{{ 1}})。
为了解决这个问题,我将ONBUILD
命令移动到了一个bash脚本中,我将其用作入口点:
manage.py
然后在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
现在似乎工作正常