docker - 如何在 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 在每次更新主分支时重建我的图像,相反,我需要自己做。
解决方案
我让它工作了。这是我所做的:
- 更改烧瓶应用程序中的端口信息(这里有更多详细信息)
- 移动
app.py
到顶层,(appdir/app.py
而不是appdir/app/app.py
) - 安装
gunicorn
- 创建一个
Procfile
项目的顶层,它应该包含web: gunicorn app:app
- 在 Dockerfile 中,最后一行应该不是
python app.py
但是gunicorn app:app
- 跑
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 机密。
推荐阅读
- google-apps-script - 谷歌表中的秒表功能可能吗?
- testng - 重试分析器和范围报告
- reactjs - react-router v4 的 Route 没有将它的 props 传递给组件 - 在 React Typescript 中
- email - MS Access 2010 - 提交表单后发送自动电子邮件
- swift - 初始不精确浮点值
- r - 替换字符串中除一个之外的所有单词的问题
- android - Unity Gradle Multidex 支持不起作用
- java - JAVA休眠GetSession
- c - 为什么在 C 中使用 strcpy 时编码会混乱
- angular - 带有 ngFor 的组件接受模板并将其传递给孩子,怎么做?