docker - 使用 heroku.yml 在 Heroku 上使用 Celery App 部署 Flask
问题描述
我真的不知道我在做什么。我正在尝试使用 heroku.yml 文件和 Dockerfile 在 Heroku 上部署带有 Celery 的 Flask 应用程序。
这是我的 heroku.yml 文件:
build:
docker:
web: Dockerfile
worker: Dockerfile
run:
web: gunicorn main:app
worker: celery worker --app=main.celery
这是我的 Dockerfile:
# Start with a base image
FROM python:3-onbuild
# Copy our application code
WORKDIR /Users/Owner/Lukas Projects/gift-apis
COPY requirements.txt .
# Fetch app specific dependencies
RUN pip install --upgrade pip
RUN pip install -r requirements.txt
ADD . .
# Expose port
EXPOSE 5000
# start the app
CMD ["gunicorn", "main:app"]
我现在不确定是否需要 Dockerfile 末尾的命令。
所以最后我正在运行git push heroku master
我收到此错误:
run.worker process type does not specify an image, such as:
remote: run:
remote: worker:
remote: command:
remote: - celery worker --app=main.celery
remote: image: <IMAGE NAME>
remote: Verifying deploy...
我不确定它在图像方面需要什么......所以我在 yml 文件的 docker 部分下添加了 worker 行。我真的不知道我在对工人形象做什么。帮助!或者,如果您知道使用 Docker 映像在 Heroku 上使用 Celery 部署 Flask 的更好方法,我会全力以赴。另外,如果重要的话,我正在使用 Redis。
解决方案
错误消息告诉您需要为工作人员提供基本映像。(我很惊讶它没有抱怨 Web 服务,但也许它只是首先打击了工作人员并且失败了。)
您应该为每个运行条目指定图像:
build:
docker:
web: Dockerfile
worker: Dockerfile
run:
web:
command:
- gunicorn main:app
image: web
worker:
command:
- celery worker --app=main.celery
image: worker
您还可以通过创建单个基本映像来简化配置,因为它们都是相同的并且在两个地方都使用它。
此外,您可能希望将启动命令移动到脚本中,因为它们会更容易使用,并且您可以在开发过程中启动这些服务时使用它们。
关于您关于CMD
条目的问题,您可以将其删除,因为看起来您在使用图像的任何地方都覆盖了它。
推荐阅读
- python - 如何检查一个类是否已在同一模块内的另一个类中使用?
- javascript - 使用 Ionic Native Deeplinks 加载 Angular 组件
- spring - 如何根据多个条件更新多行?
- flutter - 有没有办法像使用 AppBar 一样设置 CupertinoNavigationBar 的高度
- java - 在 NETBeans IDE 中编译后,Java 可执行 .jar 文件无法正常工作
- javascript - 将显示从块更改为无,然后淡入
- ruby-on-rails-5 - 在 Rails 中创建用户家族
- swift - 如何使用 IBAnimatable 库重复为 ui 视图设置动画
- azure - 无法为 Azure Web 应用程序机器人创建/编辑 Cortana 通道
- javascript - Javascript/ Typescript .bind() 获取绑定函数中的变量