Новый файл Dockerfile не может использовать файл .env для чтения переменных среды в Python

#python #docker #dockerfile #environment-variables

Вопрос:

Я нахожусь в процессе изменения своего файла dockerfile для моего скрипта python с использованием requirements.txt файл для использования pipenv и многоступенчатых сборок. Я сохраняю переменные env в файле .env, а затем импортирую ОС и использую os.environ.get функцию для их чтения. У меня возникли проблемы с переменными среды при работе с моим новым файлом dockerfile. Ниже приведены примеры того, что происходит.

1-й файл dockerfile, в котором os.environ.get(‘my_env_var’) работает в скрипте python и возвращает значение

 FROM python:3.8-slim as builder

WORKDIR /app

COPY . /app

RUN pip install -r requirements.txt

CMD ["python3", "app.py"]
 

2-й файл докера, в котором os.environ.get(‘my_env_var’) не работает и возвращается None для всего. Я вошел в контейнер и подтвердил, что файл .env все еще там и находится в том же каталоге, что и app.py файл, выполнив a ls -a в контейнере, и я побежал cat .env , чтобы убедиться, что значения все еще там.

Я скопировал большую часть этого кода из учебника, похоже, он отлично подходит для моего варианта использования.

 FROM python:3.8-slim as base

# Setup env
ENV LANG C.UTF-8
ENV LC_ALL C.UTF-8
ENV PYTHONDONTWRITEBYTECODE 1
ENV PYTHONFAULTHANDLER 1


FROM base AS python-deps

# Install pipenv and compilation dependencies
RUN pip install pipenv
RUN apt-get update amp;amp; apt-get install -y --no-install-recommends gcc

# Install python dependencies in /.venv
COPY Pipfile .
COPY Pipfile.lock .
RUN PIPENV_VENV_IN_PROJECT=1 pipenv install --deploy


FROM base AS runtime

# Copy virtual env from python-deps stage
COPY --from=python-deps /.venv /.venv
ENV PATH="/.venv/bin:$PATH"

# Create and switch to a new user
RUN useradd --create-home appuser
WORKDIR /home/appuser
USER appuser

# Install application into container
COPY . .

# Run the application
CMD ["python3", "app.py"]

 

Я недостаточно знаком с переменными Linux/dockerfiles/env, чтобы знать, хочу ли я сбросить что-то, что сделало бы это так, чтобы я больше не мог автоматически использовать файл .env для чтения переменных env с os.environ.get помощью функции. Может быть, все идет наперекосяк, потому что там есть команды ENV? Если у кого-нибудь есть какая-либо информация, я был бы признателен!

Ответ №1:

Насколько я знаю, переменные ENV задаются в команде run независимо от того, присутствует файл .env в изображении или нет.

При запуске образа docker вы должны указать, какой файл .env вы хотите иметь: docker run --env-file=path/to/env/file image:tag

Вы также можете настроить отдельные переменные env: --env ENVVARIABLE1=foobar

Аналогично, если вы работаете с docker-compose, используйте env_file