#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