【问题标题】:How to deploy a dockerized app on Heroku?如何在 Heroku 上部署 dockerized 应用程序?
【发布时间】:2020-07-03 06:30:36
【问题描述】:

我想在 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。我发现了一些相关的讨论(比如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 结尾——如果我添加该行并重新运行上述命令,那么整个过程会在构建映像时停止,最后一行是“Running on ...”——我不认为运行它异步也是正确的解决方案。

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

【问题讨论】:

  • 你需要告诉 Heroku 如何运行你的应用程序。你的 Dockerfile 有 CMD 指令吗?
  • 谢谢,我想我想通了,至少部分想通了,请在下面查看我的回答。我仍然想知道的是 Heroku 是否为这种部署策略提供了任何持续集成工具。我知道它可以选择检查主分支是否有推送以重新部署应用程序,但如果我正在部署自己的 docker 映像,我认为此选项不再可用。

标签: docker heroku


【解决方案1】:

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

  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

我仍然没有弄清楚持续集成如何适应这里(换句话说,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 机密。

【讨论】:

    猜你喜欢
    • 2019-06-24
    • 2019-10-17
    • 1970-01-01
    • 2017-05-26
    • 2016-01-24
    • 2013-02-01
    • 2016-11-25
    • 2020-07-14
    • 2011-12-08
    相关资源
    最近更新 更多