Docker не видит переменные окружения heroku

У меня есть приложение django/react/postgres/docker. Когда я пытаюсь вывести его на heroku, оно не видит переменные окружения из вкладки heroku config vars на этапе сборки


Есть ли способ получить переменные окружения heroku внутри контейнера docker?


На heroku я подключил аддон Heroku Postgres, но поскольку мои переменные env скрыты на этапе сборки, я получаю ошибку:

django.db.utils.OperationalError: could not connect to server
Is the server running on host "localhost" (127.0.0.1) and accepting                                                           
TCP/IP connections on port 5432?

Dockerfile.prod

FROM python:3.8

RUN apt-get install -y curl \
    && curl -sL https://deb.nodesource.com/setup_12.x | bash - \
    && apt-get install -y nodejs

WORKDIR /app/backend

COPY ./backend/Pipfile* /app/backend/
RUN pip install pipenv && pipenv install --system

WORKDIR /app/frontend

COPY ./frontend/package*.json /app/frontend/
RUN npm install

COPY . /app/

RUN npm run build

WORKDIR /app/frontend/build

RUN mkdir root && find . -type f -exec cp {} root \;

RUN mkdir /app/backend/staticfiles

WORKDIR /app

ENV DJANGO_SETTINGS_MODULE=config.settings.prod

RUN python backend/manage.py collectstatic --noinput

EXPOSE $PORT

RUN ["python", "backend/manage.py", "migrate", "--no-input"]
CMD [ "python", "backend/manage.py", "runserver", "0.0.0.0", $PORT]

settings.py

...
DATABASES = {
    'default': {
        'ENGINE': 'django.db.backends.postgresql',
        'NAME': env.str("DB_NAME", default="postgres"),
        'USER': env.str("DB_USER", default="postgres"),
        'PASSWORD': env.str("DB_PASS", default="postgres"),
        'HOST': env.str("DB_HOST", default="localhost"),
        'PORT': env.decimal("DB_PORT", default=5432)
    }
}

В моем коде было две проблемы:

  • Я забыл, что когда настройки django разделяются на dev/prod вариации и помещаются в отдельную директорию settings вы должны искать .env файл внутри родительской директории. Поэтому в файле settings/prod.py я изменил env.read_env() на env.read_env(BASE_DIR.joinpath('..', '.env'), recurse=False)
  • .
  • Я удалил команду python manage.py migrate из моего Dockerfile.prod и выполнил команду heroku run python manage.py migrate. Полагаю, что я мог бы поместить команду миграции в файл heroku.yml
Вернуться на верх