Docker на AWS Elastic Beanstalk - не может получить доступ к переменным среды из контейнера - PullRequest
0 голосов
/ 09 мая 2018

Я пытался переместить наше приложение Python / Django в Docker на AWS Elastic Beanstalk (один контейнер 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.

Я заметил, что здесь есть пример изображения AWS здесь , который я бы предпочел не использовать (по ряду причин, например, из-за простоты, возможности локального использования подобного изображения, отсутствия контроля и т. Д.) , Глядя на этот Dockerfile, я не могу понять, как они решили эту проблему.

Я что-то пропустил?

Ответы [ 3 ]

0 голосов
/ 14 мая 2018

Ниже приведен пример небольшого рабочего файла Docker, который я в настоящее время использую для небольшого отдельного приложения, например, для развертывания производственного экземпляра.

Один момент, касающийся переменных среды, убедитесь, что они определены в контейнере или в файле .env.

В приведенном ниже примере используется gunicorn и он работает на порте 80. Вам нужно будет указать переменные ENV для db / cache / email / other. Кроме того, убедитесь, что у вас правильно настроены группы безопасности для авторизации доступа EB к вашему RDS.

Одно замечание: вам не следует выполнять миграцию / миграцию при каждом развертывании EB. Я бы посоветовал запустить их отдельно и протестировать, прежде чем делать это, поскольку ошибки / ошибки миграции могут серьезно испортить ваш рабочий / dev-сервер, а это то, что вам не нужно.

        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"]
0 голосов
/ 14 мая 2018

В конце концов я подозревал, что здесь не так - я не думаю, что вы можете получить доступ к env vars, если вы не находитесь в фазе сборки (то есть не в командах 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

Кажется, теперь это работает нормально

0 голосов
/ 14 мая 2018

В соответствии с документацией AWS для платформы Python с эластичными beanstalk , свойства среды доступны через словарь Python os.environ. Для получения дополнительной информации перейдите на http://docs.python.org/library/os.html.

Общая информация о настройке свойств среды в Elastic Beanstalk может быть найдена здесь .

Попробуйте использовать оба эти руководства, чтобы изменить способ записи файла настроек, чтобы заставить работать оператор перенастройки RUN.

Если они не дают вам необходимых подсказок, пожалуйста, опубликуйте точное сообщение об ошибке и, возможно, строки из файла настроек в вашем вопросе, и мы сможем помочь вам лучше. Также цель доступа к настройкам (информация о подключении к БД, ключи и т. Д.)

...