【问题标题】:docker doesn't see heroku environment variablesdocker没有看到heroku环境变量
【发布时间】:2021-11-19 13:26:00
【问题描述】:

我有 django/react/postgres/docker 应用程序。当我尝试将其推送到 heroku 时,它在构建阶段看不到来自 heroku config vars 选项卡的环境变量


有没有办法在 docker 容器中获取 heroku 环境变量?


在 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)
    }
}

项目结构

.
├── backend
│   ├── config
│   ├── Dockerfile
│   ├── manage.py
│   ├── pages
│   ├── Pipfile
│   ├── Pipfile.lock
│   ├── templates
│   ├── todos
│   └── users
├── docker-compose.yml
├── Dockerfile.prod
├── frontend
│   ├── build
│   ├── Dockerfile
│   ├── Dockerfile.prod
│   ├── node_modules
│   ├── package.json
│   ├── package-lock.json
│   ├── public
│   ├── README.md
│   └── src
├── heroku.yml
└── README.md

【问题讨论】:

  • 您将“config.settings.prod”指定为您的配置路径...但不在图像中(构建时间)。您是否将该文件挂载为卷(运行时)?
  • 我使用docker-compose.yml 仅用于开发。我只是运行git push heroku master 来部署应用程序。我认为设置文件是由COPY . /app/Dockerfile.prod中的命令复制的
  • 你试过设置配置变量devcenter.heroku.com/articles/config-vars吗?
  • 是的,所有的配置变量都设置好了

标签: python django docker heroku


【解决方案1】:

我的代码有两个问题:

  • 我忘记了当 django 设置拆分为 dev/prod 变体并放入单独的目录 settings 时,您必须在父目录中搜索 .env 文件。所以在settings/prod.py 文件中我将env.read_env() 更改为env.read_env(BASE_DIR.joinpath('..', '.env'), recurse=False)
  • 我从Dockerfile.prod 中删除了python manage.py migrate 命令并执行了命令heroku run python manage.py migrate。我想我可以将迁移命令放入heroku.yml 文件中

【讨论】:

    猜你喜欢
    • 2014-08-03
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-07-28
    • 2012-05-19
    • 1970-01-01
    相关资源
    最近更新 更多