如何在Heroku中配置构建阶段环境变量?Java Maven+Docker项目自动部署凭证传递问题咨询
我之前刚好处理过类似的场景,给你几个可行的方案,帮你实现GitHub自动部署同时在构建阶段注入凭证:
方案一:用GitHub Actions完全控制构建部署流程
这是最灵活的方式,绕开Heroku自带自动部署的限制,自己掌控构建时的变量注入:
在GitHub仓库存储凭证:
进入仓库的「Settings」→「Secrets and variables」→「Actions」,添加三个Secret:HEROKU_API_KEY:你的Heroku账户API密钥(在Heroku账户设置里可以生成)HEROKU_APP_NAME:你的Heroku应用名称CREDENTIAL_URL:你的凭证下载链接
创建GitHub Action工作流:
在仓库根目录新建.github/workflows/deploy-heroku.yml,内容如下:name: Deploy to Heroku on: push: branches: [ main ] # 替换成你要自动部署的分支 jobs: deploy: runs-on: ubuntu-latest steps: - uses: actions/checkout@v4 - name: 登录Heroku容器注册表 uses: docker/login-action@v3 with: registry: registry.heroku.com username: _ password: ${{ secrets.HEROKU_API_KEY }} - name: 构建并推送Docker镜像 run: | docker build --build-arg CREDENTIAL_URL=${{ secrets.CREDENTIAL_URL }} -t registry.heroku.com/${{ secrets.HEROKU_APP_NAME }}/web . docker push registry.heroku.com/${{ secrets.HEROKU_APP_NAME }}/web - name: 发布到Heroku run: | heroku container:release web -a ${{ secrets.HEROKU_APP_NAME }} env: HEROKU_API_KEY: ${{ secrets.HEROKU_API_KEY }}测试自动部署:
推送代码到指定分支,GitHub Actions会自动执行构建(注入凭证链接)、推送镜像、发布应用的流程。
方案二:用Heroku Config Vars + Dockerfile ARG实现自动构建
如果你想继续用Heroku自带的GitHub自动部署功能,可以通过app.json配置让Heroku在构建时传递Config Var作为Docker构建参数:
修改Dockerfile:
添加构建参数ARG,并在构建阶段使用它(推荐用多阶段构建避免凭证残留):# 构建阶段 FROM maven:3.8.6-openjdk-17 AS build ARG CREDENTIAL_URL # 构建阶段下载凭证并用于打包 RUN curl $CREDENTIAL_URL -o /tmp/credentials.json COPY . /app WORKDIR /app RUN mvn clean package -Dcredentials.path=/tmp/credentials.json # 运行阶段(仅保留最终应用,不包含构建环境和凭证) FROM openjdk:17-jdk-slim COPY --from=build /app/target/your-app.jar /app/app.jar CMD ["java", "-jar", "/app/app.jar"]添加app.json配置文件:
在仓库根目录创建app.json,指定构建参数映射:{ "name": "你的应用名称", "buildpacks": [{"url": "heroku/docker"}], "env": { "CREDENTIAL_URL": { "description": "凭证下载链接", "required": true } }, "build": { "docker": { "web": { "args": { "CREDENTIAL_URL": "$CREDENTIAL_URL" } } } } }在Heroku设置Config Var:
打开Heroku应用的「Settings」→「Config Vars」,添加CREDENTIAL_URL并填入你的凭证链接。启用Heroku自动部署:
在Heroku应用的「Deploy」选项卡关联GitHub仓库,开启自动部署即可。每次推送代码时,Heroku会自动把Config Var作为构建参数传递给Docker,完成带凭证的构建。
注意事项
- 优先使用多阶段构建,确保构建阶段的凭证和参数不会留在最终运行的镜像里,避免安全风险。
- 绝对不要把凭证硬编码在代码或Dockerfile里,始终用Secret/Config Var管理敏感信息。
内容的提问来源于stack exchange,提问作者Dhina17

