Python выдает KeyError при экспорте переменных среды

Python выдает KeyError при экспорте переменных среды

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

секрет.env

export TWITTER_CONSUMER_KEY="something"
export TWITTER_CONSUMER_SECRET="something"

Затем я создал Docker-файл для экспорта всех переменных и запуска приложения следующим образом:

FROM python:3.8-slim-buster

# Set the working directory to /app
WORKDIR /app

# Copy the current directory contents into the container at /app
ADD . /app

# Install the dependencies
RUN pip install -r requirements.txt

RUN find . -name \*.pyc -delete

# Export all variables
RUN /bin/bash -c "source secret.env";

# tell the port number the container should expose
EXPOSE 8083

# run the command
ENTRYPOINT ["python", "run.py"]

Однако это приводит к ключевой ошибке:

$ docker run --name fortweet --rm -i -t fortweet:latest bash
Traceback (most recent call last):
  File "run.py", line 1, in <module>
    from app import socketio, app
  File "/app/app/__init__.py", line 65, in <module>
    app = create_app()
  File "/app/app/__init__.py", line 38, in create_app
    my_settings = settings.TwitterSettings.get_instance()
  File "/app/app/setup/settings.py", line 47, in get_instance
    TwitterSettings()
  File "/app/app/setup/settings.py", line 14, in __init__
    self.consumer_key = os.environ["TWITTER_CONSUMER_KEY"]
  File "/usr/local/lib/python3.8/os.py", line 675, in __getitem__
    raise KeyError(key) from None
KeyError: 'TWITTER_CONSUMER_KEY'

Когда я запускаю это на Windows, все работает отлично!

Может ли кто-нибудь мне помочь в этом вопросе?

решение1

Измените последнюю строку на:

ENTRYPOINT ["/bin/bash", "-c", "source secret.env ; python run.py"]

вместо этого, и удалите, RUNгде вы выполняете поиск. Смотрите такжеhttps://goinbigdata.com/docker-run-vs-cmd-vs-entrypoint/для объяснения разницы между RUN, CMDи ENTRYPOINT.

В двух словах:

  • RUN выполняет команду(ы) в новом слое и создает новый образ. Например, часто используется для установки пакетов программного обеспечения.
  • CMD устанавливает команду и/или параметры по умолчанию, которые можно перезаписать из командной строки при запуске контейнера Docker.
  • ENTRYPOINT настраивает контейнер, который будет работать как исполняемый файл.

Я не эксперт по Docker, но использовал его на работе несколько раз, так что имею некоторое базовое представление о нем. Я думаю, что это работает из-за наслоения и, что более важно, потому что действие источника переменных среды происходит исключительно в области памяти, а не хранения на диске. Таким образом, источник в RUN на самом деле ничего не достигает. Вам нужно получить их в точке выполнения вашего фактического приложения, поэтому работает исправление ENTRYPOINT выше, потому что мы вызываем BASH, получаем переменные в среду, а затем разветвляем ваше приложение Python, все в одной оболочке, во время выполнения.

Однако это все еще не объясняет, почему это работает в вашей среде Windows. Я подозреваю, что у вас где-то в среде Windows установлены переменные среды, поэтому это работает, но не по той причине, по которой вы думаете.

Связанный контент