如何在Heroku上部署dockerized应用?

时间:2020-03-22 17:28:31

标签: docker heroku

我想在Heroku上部署基本的Flask应用。

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

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

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

我能够在本地以及通过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。我发现了一些相关的讨论(例如this),似乎暗示了诗歌可能是个问题,我需要一个requirements.txt,但是即使生成一个,我仍然会遇到同样的错误。

有人知道这里发生了什么吗?我觉得根本上是错的,因为我什至不需要构建包-docker映像应该解决这个问题。仅供参考,heroku.yml包含以下内容:

build:
  docker:
    web: Dockerfile

请告诉我是否应该分享有关我的应用设置的更多信息。

非常感谢!

更新1:

我设法通过heroku container:push web -a APP_NAME,然后通过heroku container:release web -a APP_NAME将docker映像推送到Heroku,但是当我打开应用程序https://APP_NAME.herokuapp.com/时,我发现它无法启动,这不是令人惊讶的是,我的dockerfile并不以RUN python app.py结尾-如果我添加该行并重新运行以上命令,则在构建映像时整个过程停止,最后一行是“正在运行...”-我也不认为异步运行不是这里的正确解决方案。

有什么建议吗?如果我设法让Heroku容器正常工作,那么我想这意味着我每次更新master分支时都无法让Heroku重建映像,而是需要自己完成。

1 个答案:

答案 0 :(得分:2)

我知道了。这是我所做的:

  1. 更改烧瓶应用程序内的端口信息(此处为more detail
  2. app.py移至顶层,(appdir/app.pyappdir/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

尽管如此,我仍然没有弄清楚Continuous Integration如何适合这里(换句话说,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机密中。