在docker容器中运行djangoworker和daphne

2024-02-20

我有在 docker 容器中运行的 django 应用程序。最近我发现我需要向我的应用程序添加 websockets 接口。我在 nginx 和 redis 后面使用带有 daphne 的通道作为缓存。问题是我必须在 1 个容器中运行 django 工作人员和 daphne。 在容器启动时运行的脚本:

#!/usr/bin/env bash

python wait_for_postgres.py
python manage.py makemigrations
python manage.py migrate
python manage.py collectstatic --no-input

python manage.py runworker --only-channels=http.* --only-channels=websocket.* -v2
daphne team_up.asgi:channel_layer --port 8000 -b 0.0.0.0

但它取决于运行一个工人。我尝试了 nohup 但似乎不起作用。如果我使用 docker exec 直接从容器运行 daphne ,一切都会正常。


这是一个老问题,但我想我无论如何都会回答它,因为我最近遇到了同样的问题,并且认为我可以对此有所了解。

Django 通道如何工作

Django Channels 是 Django 之上的另一层,它有两种流程类型:

  • 接受 HTTP/Websocket 的一种
  • 运行 Django 视图、Websocket 处理程序、后台任务等的一个

基本上,当请求传入时,它首先到达接口服务器 (Daphne),该服务器接受 HTTP/Websocket 连接并将其放入 Redis 队列中。然后,工作人员(消费者)会看到它,将其从队列中取出并运行视图逻辑(例如 Django 视图、WS 处理程序等)。

为什么它对你不起作用

因为您只运行工作线程(消费者),并且它阻止了接口服务器(生产者)的执行。这意味着,不会接受任何连接,并且工作人员只是盯着空的 Redis 队列。

我是如何让它发挥作用的

我将 Daphne、redis 和工人作为单独的容器运行,以便于扩展。数据库迁移、静态文件收集等仅在 Daphne 容器中执行。该容器将仅运行一个实例,以确保没有并行数据库迁移正在运行。

另一方面,工作人员可以扩大或缩小规模来处理传入的流量。

如何让它发挥作用

将您的设置分为at least两个容器。我不建议在一个容器中运行所有内容(使用导师 http://supervisord.org例如)。为什么?因为当需要扩展设置时,没有简单的方法可以做到。您可以将容器扩展到两个实例,但这只会创建另一个包含 daphne、redis、django 的主管...如果您将工作程序与 daphne 分开,您可以轻松地扩展工作程序容器以处理不断增长的传入请求。

一个容器可以运行:

#!/usr/bin/env bash

python wait_for_postgres.py
python manage.py migrate
python manage.py collectstatic --no-input

daphne team_up.asgi:channel_layer --port 8000 -b 0.0.0.0

而另一个:

#!/usr/bin/env bash

python wait_for_postgres.py
python manage.py runworker --only-channels=http.* --only-channels=websocket.* -v2

“makemigrations”命令

无需运行您提供的脚本中的命令,如果有任何事情可能会因为等待输入的某些问题而阻止整个事情(例如“您是否将 X 列重命名为 Y ?”)。

相反,您可以在正在运行的容器中执行它,如下所示:

docker exec -it <container_name> python manage.py makemigrations
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

在docker容器中运行djangoworker和daphne 的相关文章

随机推荐

  • Gitlab 部署脚本 - envsubst:找不到命令

    我有一个带有 CI CD 管道的 gitlab 存储库 它有deploy sh脚本 该脚本可以顺利运行 直到envsubst命令 bin bash set e lt gt deploy via ssh SSH ssh o UserKnown
  • 在 xml 内的图像上绘制视图

    你能帮助我分享你关于如何在android中的图像顶部绘制一个小矩形的知识吗 我有 main xml 和一些小部件 在顶部 有一个图像 我想在该图像上绘制一个矩形 并在应用程序运行时显示这两个矩形 我的 xml 文件如下所示
  • 验证 Rails 中多对多关联的唯一性

    说我有Project 即与多对多关联Tag 我在用着有 许多通过所以我有单独的连接模型 如何创建验证来检查连接模型的唯一性 现在我只有 has many tags through gt taggings uniq gt true 但这并不在
  • MVC 应用程序调试时出错:视图状态 MAC 验证失败

    现在开始表单 第一次 当我开始调试 MVC 应用程序时 我收到此错误 视图状态 MAC 验证失败 如果 该应用程序由 Web 托管 农场或集群 确保 配置指定 相同的validationKey和validation 算法 无法使用自动生成
  • 如何使用 NHibernate 高效地进行 TDD?

    在我看来 大多数人在使用 NHibernate 时都会针对内存中 进程内数据库 例如 SQLite 编写测试 我已经启动并运行了它 但我的第一个测试 使用 NHibernate 总是需要 3 4 秒才能执行 下一个测试运行得更快 我使用 F
  • 是否有 gist.github.com 的内部替代方案可以在防火墙后面运行?

    gist github com 非常方便 但我希望能够运行类似的东西来与我工作的防火墙后面的其他开发人员在内部共享代码示例 因此我不需要一直清理我的代码 只讲代码示例 有这样的事情存在吗 我并不追求大型项目管理工具 只是一种制作一次性要点并
  • OpenShift 无法处理某些 Nodejs 依赖项 (Koa)

    我已经结账了如何在 Openshift 中设置 KoaJS https stackoverflow com questions 26924967 how to setup koajs in openshift但它仍然不起作用 这是我的一部分
  • Apache 作为 ubuntu 上的 root

    好的 我需要运行我的 Apache Web 服务器root 为此我输入了whoami 在终端 它给了我输出 root 但是当我通过执行以下 php 脚本检查我的 apache 服务器是否以 root 用户身份运行时 它给了我输出 nobod
  • 从终端安装 npm 错误

    我正在尝试在我的 mac 中安装节点 我收到以下错误 我从节点站点下载了节点并运行了该包 你们能告诉我为什么我会遇到这个错误 当我执行 npm install 时 MacBook Pro Raj npm install npm ERR in
  • Pickle 无法与 tkinter 一起使用

    我正在用 Tkinter 制作一个小游戏 它有一个使用 pickle 的保存功能 但是 当我尝试保存时 它会弹出以下消息 Exception in Tkinter callback Traceback most recent call la
  • 具有嵌套列表的 Terraform 动态块

    我需要使用 Terraform 在 Pagerduty 中创建升级策略 我想动态创建rule块 然后在其中target块的值来自rule 我不知道如何在目标块内进行第二次调用以使其动态 我有一个列表中的团队列表 locals teams d
  • React Native - 动态列出/需要目录中的文件

    我正在使用 Redux 并希望动态包含目录中的所有文件 redux index js Actions import as authActions from auth authActions import as deviceActions f
  • 如何从图像中仅提取字符?

    我有这种类型的图像 我只想从中提取字符 二值化后 我得到这个图像 img cv2 imread the image jpg gray cv2 cvtColor img cv2 COLOR BGR2GRAY thresh cv2 adapti
  • 如何在密度分布图的两端添加两个阴影

    如何在两端添加阴影 如下图所示 我想添加一端从 0 到 995 和 1 995 到 Inf 我在这里尝试了解决方案https stackoverflow com a 4371473 3133957 https stackoverflow c
  • 如何用 Python 构建提升图(又名增益图)?

    我刚刚使用 scikit learn 创建了一个模型 它可以估计客户对某些报价做出回应的可能性 现在我正在尝试评估我的模型 为此 我想绘制提升图 我理解 lift 的概念 但我很难理解如何在 python 中实际实现它 您可以使用sciki
  • NetLogo 以字符列表的形式读入文件

    我是 NetLogo 新手 我有一个包含一行值的文本文件 ABC CDC BBC 我试图读取该文件的第一行作为字符列表 例如 A B C 我一直在尝试使用文件读取行 但它创建了一个字符串 ABC observer gt file open
  • 如何开始程序生成?

    程序生成 http en wikipedia org wiki Procedural generation最近 由 Spore MMO 等 引起了人们的关注 它似乎是一种有趣 强大的编程技术 我的问题是 您知道有哪些使用程序生成技术的中型项
  • 在 ASP.NET WebApi 中测试路由配置

    我正在尝试对我的进行一些单元测试WebApi http www asp net web api路由配置 我想测试一下路线 api super 映射到Get 我的方法SuperController 我已经设置了以下测试 但遇到了一些问题 pu
  • 为复选框数组放置错误消息

    我正在使用 jQuery 的验证插件 它的效果非常好 除非我有一组复选框 错误消息将在第一个复选框之后显示 就像这样 tbody tbody
  • 在docker容器中运行djangoworker和daphne

    我有在 docker 容器中运行的 django 应用程序 最近我发现我需要向我的应用程序添加 websockets 接口 我在 nginx 和 redis 后面使用带有 daphne 的通道作为缓存 问题是我必须在 1 个容器中运行 dj