我想在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重建映像,而是需要自己完成。
答案 0 :(得分:2)
我知道了。这是我所做的:
app.py
移至顶层,(appdir/app.py
与appdir/app/app.py
相对)gunicorn
Procfile
,其中应包含web: gunicorn app:app
python app.py
,而应为gunicorn app:app
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机密中。