#8932·dokku

在集群中运行部署阶段的部署任务,而不是在 Dokku 主机上运行

作者: josegonzalez创建于 2026年8月11日更新于 2026年8月12日
标签type: enhancementmerge-level: patchneeds: planplugin: scheduler-k3s

app.json 部署任务在 Dokku 主机上通过 executeScript ( plugins/app-json/functions.go:140) 在临时的 Docker 容器中运行。对于工作负载不在该主机上的调度器,特别是 k3s,这是错误的执行上下文。范围比最初看起来要窄一些。predeploy、Procfile 的 release 命令和 Heroku 的 scripts.postdeploy 都来自于发布阶段(pre-release-builder/post-release-builder),其设计要求本地镜像:release_and_deploy 门户在 fn-verify-app-imageplugins/common/functions:677)上,predeploy 将容器重新提交到镜像标签中( plugins/app-json/functions.go:284-315),而没有清晰的 Kubernetes 任务对应。它们可以留在主机上。唯一一个部署阶段任务是 scripts.dokku.postdeploy,它来自于 post-deploy 触发器( plugins/app-json/triggers.go:189)。在 k3s 上,它在构建主机上运行,而刚刚部署的应用程序则在集群中运行。后果:

  • 它需要本地存在镜像,这与注册插件自己的镜像清理( plugins/registry/functions.go:230-247)相冲突。
  • 它以主机对世界的观点来执行,而不是集群的观点。一个 postdeploy 迁移可能无法访问集群中的数据库,并且它看不到应用程序的 Kubernetes 秘密、服务发现或网络策略。
  • 应用程序的资源限制、节点选择和安全上下文不适用。