Docker-compose не передает переменные окружения в Docker-контейнер - PullRequest
3 голосов
/ 27 октября 2019

У меня есть приложение Python, которое использует переменные среды, и я хочу выполнить настройку dev \ prod с одним файлом Dockerfile и одним файлом docker-compose.yml (изменяйте только файл env с переменными среды).

Вот файлы, которые я использую для запуска приложения:
Dockerfile :

FROM python:3.7-slim-buster
RUN apt-get update

WORKDIR /usr/src/app
RUN mkdir /usr/src/app/excel_users_dump
COPY ./requirements.txt .
RUN pip install -r requirements.txt

COPY . .
RUN python /usr/src/app/myblumbot/main.py

docker-compose.yml :

version: '3'
services:
  bot:
    build:
      context: .
    environment:
      ENV: ${ENV}
      PYTHONPATH: ${PYTHONPATH}
      PYTHONBUFFERED: ${PYTHONBUFFERED}
    volumes:
      - states:/var/myblumbot_states

volumes:
  states:

.env (в том же каталоге, что и docker-compose.yml)

PYTHONBUFFERED=1  
PYTHONPATH=/usr/src/app  
ENV=DEV

Когда я запускаю команду docker-compose up, она создает иговорит, что у меня не было переменных среды, поэтому приложение не может запуститься.

env = os.environ['ENV'] 

KeyError: 'ENV'

Но если я добавлю ENV VAR value в Dockerfile , все будет хорошо.

Как передать переменные из docker-compose и файла .env?

Ответы [ 2 ]

3 голосов
/ 27 октября 2019

Если у вас есть настройки с файлами Dockerfile и docker-compose.yml, как вы показываете, все происходит в два этапа. На первом этапе создается изображение, а на втором этапе фактически запускается контейнер. Большинство настроек в docker-compose.yml не действуют на этапе сборки ;это включает сетевые настройки, переменные среды и опубликованные порты.

В вашем Dockerfile вы запускаете приложение с шагом RUN. Это происходит как часть сборки, а не фазы выполнения;образ, который в итоге создается, является файловой системой, которая появляется после выхода из приложения. Так как это на этапе сборки, настройки переменных среды не вступают в силу.

Если вы измените RUN на CMD, то это будет записано в образе, и после завершения сборки будетзапускать как основной контейнерный процесс с переменной среды и другими настройками.

(В комментариях вы предлагаете ENTRYPOINT. Это также будет работать, по тем же причинам, но это делает пару задач, таких как получение отладочной оболочкисложнее, и есть стандартный шаблон первоначальной настройки Docker, который требует ENTRYPOINT для своих собственных целей. Я бы предпочел CMD здесь.)

1 голос
/ 27 октября 2019

Попробуйте следовать документам :

Compose поддерживает объявление переменных среды по умолчанию в файле среды с именем .env, помещенном в папку, где выполняется команда docker-compose (текущий рабочий каталог)

Попробуйте использовать ENTRYPOINT python /usr/src/app/myblumbot/main.py вместо RUN...

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...