Heroku环境变量$ DATABASE_URL和$ PORT未在dyno中显示(heroku ps:exec)

时间:2020-06-21 18:41:18

标签: docker heroku github-actions

我创建了一个docker映像并将其发布到heroku。为了使其正常工作,我需要DATABASE_URL env变量。 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 db注入了种子。 我不知道是否需要第二个ENV,这是我试图使某些东西正常工作的产物。

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

3 个答案:

答案 0 :(得分:0)

在我看来,您的问题是an ARG instruction goes out of scope at the end of the build stage where it was defined,因此您也需要在构建的第二阶段中定义的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

答案 1 :(得分:0)

当然,这是我特定于heroku使用情况的错误。

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

答案 2 :(得分:0)

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

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

我使用 PostgreSQL 插件 DATABASE_URL 设置了 heroku addons:create heroku-postgresql:hobby-dev,它们显示在网络界面的“配置变量”下。

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

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