首页 > 解决方案 > 如何在 Heroku 上部署 dockerized 应用程序?

问题描述

我想在 Heroku 上部署一个基本的 Flask 应用程序。

这是我的应用程序的基本结构:

├── Dockerfile
├── Makefile
├── README.rst
├── app
│   ├── __init__.py
│   └── app.py
├── heroku.yml
├── poetry.lock
├── pyproject.toml
└── tests
    ├── __init__.py
    └── test_app.py

我希望每次将 PR 合并到项目的主分支时都重新部署该应用程序,因此我通过 Heroku 中的自动部署选项进行了设置。

我能够在本地以及通过 docker 容器(也在本地)成功运行此应用程序,但是,Heroku 无法部署该应用程序。我遇到的第一个错误是No default language could be detected for this app导致我为此应用程序(python)启用构建包。设置构建包后,我收到以下错误:App not compatible with buildpack: https://buildpack-registry.s3.amazonaws.com/buildpacks/heroku/python.tgz ... ! push failed. 我发现了一些相关的讨论(比如这个),这些讨论似乎表明 Poetry 可能是问题所在,我需要一个requirements.txt,但即使在生成一个之后,我仍然会遇到同样的错误。

有谁知道这里发生了什么?我觉得有些事情根本上是错误的,因为我什至不需要构建包 - docker 映像应该负责这一点。仅供参考,heroku.yml包含以下内容:

build:
  docker:
    web: Dockerfile

如果我应该分享有关我的应用设置的更多信息,请告诉我。

非常感谢!

更新 1:

我已经设法通过heroku container:push web -a APP_NAME后跟将我的 docker 映像推送到 Heroku heroku container:release web -a APP_NAME,但是当我打开应用程序https://APP_NAME.herokuapp.com/时,我发现它无法启动,这并不奇怪,因为我的 dockerfile 没有以RUN python app.py-- 如果我添加该行并重新运行上述命令,那么整个过程会在构建图像时停止,最后一行是“Running on ...” -- 我不认为异步运行它是正确的解决方案在这里。

有什么建议么?如果我设法让 Heroku 容器工作,那么我想这意味着我无法让 Heroku 在每次更新主分支时重建我的图像,相反,我需要自己做。

标签: dockerheroku

解决方案


我让它工作了。这是我所做的:

  1. 更改烧瓶应用程序中的端口信息(这里有更多详细信息
  2. 移动app.py到顶层,(appdir/app.py而不是appdir/app/app.py
  3. 安装gunicorn
  4. 创建一个Procfile项目的顶层,它应该包含web: gunicorn app:app
  5. 在 Dockerfile 中,最后一行应该不是python app.py但是gunicorn app:app
  6. heroku container:push web -a APP_NAME; heroku container:release web -a APP_NAME

我还没有弄清楚持续集成是如何适应这里的(换句话说,Heroku 本身在这里提供什么吗?),所以如果有人有任何建议,请告诉我

更新

只是想为 CI 添加它,我最终使用了 GitHub 操作。我创建了一个文件,.github/workflows/deploy.yaml其中包含以下内容:

    - name: deploy
      env:
        HEROKU_API_KEY: ${{ secrets.HEROKU_API_TOKEN }}
        HEROKU_APP_NAME: "covid-monitor"
      run: |
        heroku container:login
        heroku container:push web -a $(appname)
        heroku container:release web -a $(appname)

请注意,要使其正常工作,您需要将 Heroku API 令牌添加到 GitHub 机密。


推荐阅读