Heroku env 变量 $DATABASE_URL 和 $PORT 未显示在 dyno 中 (heroku ps:e



我创建了一个docker镜像并将其发布到heroku。为了使它正常工作,我需要DATABASE_URLenv 变量。Postgres 已预配到应用程序,我可以很好地heroku config:get数据库 URL。然而,在完成所有操作后,我heroku ps:exec我的应用程序,键入"env",没有$PORT$DATABASE_URL,这意味着我的应用程序无法获取数据库字符串。

我采取的步骤:

Github操作:

- name: Build and deploy the Docker image
env: 
HEROKU_API_KEY: ${{ secrets.HEROKU_API_KEY }}
APP_NAME: myApp
run: |
export DATABASE_URL=$(heroku config:get DATABASE_URL --app ${{ env.APP_NAME }})
docker login --username=_ --password=${{ env.HEROKU_API_KEY }} registry.heroku.com
docker build --build-arg DATABASE_URL_ARG=$DATABASE_URL -t registry.heroku.com/${{ env.APP_NAME }}/web .
docker push registry.heroku.com/${{ env.APP_NAME }}/web

Dockerfile:

FROM mcr.microsoft.com/dotnet/core/sdk:3.1 AS publish
WORKDIR /src
ARG DATABASE_URL_ARG
ENV DATABASE_URL=$DATABASE_URL_ARG
COPY . .
RUN dotnet tool install dotnet-ef && dotnet publish -c Release -o ./publish
FROM mcr.microsoft.com/dotnet/core/aspnet:3.1 AS runtime
ENV DATABASE_URL=$DATABASE_URL_ARG
WORKDIR /app
COPY --from=publish /src/publish .
CMD DATABASE_URL=${DATABASE_URL} dotnet app.dll

构建过程成功,并且 postgres 数据库已播种。 我不知道是否需要第二个 ENV,它是我试图让某些东西发挥作用的工件。

所以问题是:丢失的$PORT和$DATABASE_URL在哪里,我是如何使它们消失的?

使用heroku run bash而不是heroku ps:exec

学习自: https://stackoverflow.com/a/64951959/895245

我用PostgreSQL插件heroku addons:create heroku-postgresql:hobby-dev设置了DATABASE_URL,它们显示在Web界面的"Config Vars"下。

该应用程序运行良好,变量存在,但heroku ps:exec没有它们,而heroku run bash有。

heroku run bash在不同的上下文中 https://devcenter.heroku.com/articles/one-off-dynos 提到,所以我认为使用它应该没问题。

在我看来,您的问题是 ARG 指令在定义的构建阶段结束时超出了范围,因此您还需要在构建的第二阶段定义的 ARG:

# ...
FROM mcr.microsoft.com/dotnet/core/aspnet:3.1 AS runtime
ARG DATABASE_URL_ARG
ENV DATABASE_URL=$DATABASE_URL_ARG
WORKDIR /app
COPY --from=publish /src/publish .
CMD DATABASE_URL=${DATABASE_URL} dotnet app.dll

当然,这是我针对heroku用法的错误。

将 docker 映像推送到 heroku 后,运行heroku container:release web我没有这样做,所以我看不到我的更改。根据文档,$DATABASE_URL 和 $PORT 会自动添加到环境中,并在运行时可用。

最新更新