
Dokku 应用生命周期管理完全指南apps 命令体系与属性详解【免费下载链接】dokkuA docker-powered PaaS that helps you build and manage the lifecycle of applications项目地址: https://gitcode.com/GitHub_Trending/do/dokku本文围绕 Dokku 核心插件appsplugins/apps展开系统讲解应用的创建、列出、克隆、重命名、销毁、部署锁与报告等全生命周期管理命令并结合源码实现说明每个命令的底层行为与注意事项。读完本文你将能熟练运用dokku apps:*命令族完成应用的日常运维并理解 Dokku 应用在磁盘与属性存储层面的组织方式。命令总览应用管理是 Dokku 使用频率最高的操作之一所有命令均由apps插件提供核心命令实现见 plugins/apps/apps.go。完整命令清单如下apps:clone old-app new-app # Clones an app apps:create app # Create a new app apps:destroy app # Permanently destroy an app apps:exists app # Checks if an app exists apps:list [--format stdout|json] # List your apps apps:lock app # Locks an app for deployment apps:locked app # Checks if an app is locked for deployment apps:rename old-app new-app # Rename an app apps:report [app] [flag] # Display report about an app apps:set [--global] app key (value) # Set or clear an apps property for an app apps:unlock app # Unlocks an app for deployment[!IMPORTANT]apps:*命令体系自 Dokku 0.3.1 起引入后续版本持续增强如apps:list于 0.8.1、apps:rename于 0.4.7、apps:clone于 0.11.5、apps:lock/apps:unlock于 0.11.6、apps:locked于 0.13.0 加入。列出应用apps:listapps:list用于列出 Dokku 主机上的全部应用自 0.8.1 起可用更早版本使用apps命令dokku apps:list输出示例 My Apps node-js-app python-app底层实现中CommandListplugins/apps/apps.go#L102-L132调用common.DokkuApps()获取应用列表并在没有任何应用时输出提示而不是报错退出这使其非常适合在脚本中安全使用。精简输出与 JSON 格式命令行场景下可以使用--quiet全局标志隐藏 Dokku 命令的额外输出便于程序化解析dokku --quiet apps:listnode-js-app python-app需要供外部程序消费时--format json会输出 JSON 数组dokku apps:list --format json[node-js-app,python-app]当主机上没有任何应用时JSON 输出为空数组[]。相关的 JSON 序列化逻辑同样位于 plugins/apps/apps.go 的CommandList中其在NoAppsExist错误场景下仍会输出合法的[]。检查应用是否存在apps:exists在 CI/CD 流水线中为某个分支创建预发布review应用之前通常需要先确认目标应用是否已存在此时可使用apps:existsdokku apps:exists node-js-app当应用不存在时输出App does not exist该命令的退出码遵循约定应用不存在时返回非零存在时返回 0对应实现CommandExists直接返回appExists(appName)的结果见 plugins/apps/apps.go#L96-L99。在 bash 脚本中可以直接利用退出码进行分支判断if dokku apps:exists my-app; then echo 应用已存在 else dokku apps:create my-app fi手动创建应用apps:create先配置、后部署是 Dokku 上常见的应用交付模式先用apps:create显式创建应用完成各项配置后再执行部署dokku apps:create node-js-appCreating node-js-app... done创建应用后可以按需完成以下任一或全部配置再择机部署配置域名与 SSL 证书参见 docs/configuration/domains.md 与 docs/configuration/ssl.md创建并关联数据存储datastore设置环境变量参见 docs/configuration/environment-variables.md。创建背后的源码细节从源码看plugins/apps/functions.go#L25-L47createApp依次完成通过common.IsValidAppName校验应用名正则^[a-z0-9][a-z0-9.-]*$即必须以小写字母/数字开头只能包含小写字母、数字、点与连字符见 plugins/common/common.go#L1009-L1020确认同名应用不存在否则报错Name is already taken在/home/dokku/appcommon.AppRoot创建应用目录写入created-at属性UNIX 时间戳触发post-create钩子通知其他插件完成各自的初始化如 plugins/00_dokku-standard 中的应用初始化逻辑。值得注意的是创建应用并不等于部署应用——容器、构建等动作要等到真正 push 代码时才会发生。禁用自动创建应用默认情况下向一个尚不存在的应用名执行git pushDokku 会自动创建该应用。但在共享主机或生产环境运维人员往往希望强制要求先显式执行apps:create。全局属性disable-autocreation控制这一行为dokku apps:set --global disable-autocreation true设置生效后任何针对不存在应用的 push 都会被拒绝。恢复默认行为只需传入空值dokku apps:set --global disable-autocreation从源码看该逻辑位于maybeCreateAppplugins/apps/functions.go#L130-L144当disable-autocreation为true时会输出警告App auto-creation disabled.并返回错误提示用户重新启用自动创建或改用dokku apps:create app手动创建。同时CommandSet会拦截对非全局作用域设置该属性的调用见 plugins/apps/apps.go#L248-L254因为该属性仅支持 global 作用域。对应的 bats 单元测试见 tests/unit/apps_1.bats 中的(apps) app autocreate disabled用例。销毁应用apps:destroy当应用是临时性的或配置错误需要清理时可执行销毁dokku apps:destroy node-js-app! WARNING: Potentially Destructive Action ! This command will destroy node-js-app (including all add-ons). ! To proceed, type node-js-app node-js-app Destroying node-js-app (including all add-ons)Dokku 的所有破坏性操作都需要二次确认这里要求输入被销毁应用的名称。若需跳过确认可使用--force标志——它既可以作为全局标志放在命令前也可以作为子命令标志放在命令后dokku --force apps:destroy node-js-appdokku apps:destroy --force node-js-app销毁行为的底层链路销毁应用会解除所有关联服务add-on的链接并销毁与该应用相关的全部配置。从destroyApp的实现看plugins/apps/functions.go#L50-L122完整链路包括若未设置DOKKU_APPS_FORCE_DELETE环境变量则调用common.AskForDestructiveConfirmation请求交互确认--force标志通过os.Setenv(DOKKU_APPS_FORCE_DELETE, 1)跳过确认见 plugins/apps/apps.go#L84-L94依次触发pre-delete、scheduler-stop停止并移除容器、scheduler-post-delete、post-delete钩子执行 Docker 清理并scheduler-retire退役旧容器与镜像最后移除应用根目录及其内容。[!NOTE] 已关联服务如数据库虽然会被解除链接但其数据会被保留可在之后继续使用或手动清理。重命名应用apps:rename[!IMPORTANT] 自 0.4.7 起可用。apps:rename可以重命名一个已部署的应用。注意应用必须至少部署过一次否则重命名不会成功dokku apps:rename node-js-app io-js-appDestroying node-js-app (including all add-ons) ----- Cleaning up... ----- Building io-js-app from herokuish... ----- Adding BUILD_ENV to build environment... ----- Node.js app detected ----- Creating runtime environment ... Application deployed: http://io-js-app.ci.dokku.me Renaming node-js-app to io-js-app... done重命名的过程是把旧应用的全部内容复制到以新名字命名的应用目录删除旧应用然后重新构建并部署新版本。所有配置变量包括数据库连接 URL都会保留。跳过部署与更新 git remote默认情况下 Dokku 会部署重命名后的应用如需跳过部署可使用--skip-deploydokku apps:rename --skip-deploy node-js-app io-js-app重命名后别忘了在本机更新 git remote让git push dokku main重新指向新应用名git remote set-url dokku dokkudokku.me:io-js-app从源码看plugins/apps/apps.go#L163-L223CommandRename的执行顺序是校验新旧应用名 → 确认新名字未被占用 → 创建新应用 → 触发post-app-rename-setup复制属性与数据目录见 plugins/apps/triggers.go#L104-L115→ 强制删除旧应用设置DOKKU_APPS_FORCE_DELETE1→ 触发git-has-code判断是否重新构建 → 触发post-app-rename完成数据目录迁移见 plugins/apps/triggers.go#L99-L102。--skip-deploy通过设置SKIP_REBUILDtrue环境变量来抑制重建。克隆应用apps:clone[!IMPORTANT] 自 0.11.5 起可用。apps:clone用于克隆现有应用适合快速创建环境如预发布、测试环境。与重命名相同源应用必须至少部署过一次dokku apps:clone node-js-app io-js-appCloning node-js-app to io-js-app... done克隆会把源应用的全部内容复制到新应用目录并重新构建、部署新版本但有以下约束全部环境变量包括数据库连接 URL都会保留自定义域名不会应用到新应用SSL 证书不会复制到新应用方案scheme为https且主机端口为443的端口映射会被跳过。[!WARNING] 如果你通过docker-options插件暴露了特定端口或执行了任何无法针对多个应用同时生效的操作apps:clone可能会报错。默认情况下 Dokku 会部署克隆出的新应用可通过--skip-deploy跳过dokku apps:clone --skip-deploy node-js-app io-js-app如果目标应用已经存在又想忽略覆盖时产生的错误可以使用--ignore-existing——此时命令会输出警告但仍然返回 0dokku apps:clone --ignore-existing node-js-app io-js-app从源码看plugins/apps/apps.go#L12-L72CommandClone会先校验源/目标应用名再检查目标是否已被占用配合ignoreExisting决定是忽略并警告还是报错Name is already taken随后创建新应用、触发post-app-clone-setup复制属性与数据见 plugins/apps/triggers.go#L89-L97最后根据git-has-code与skipDeploy决定是否重建。各插件如 domains、certs、nginx-vhosts 等的post-app-clone-setup钩子共同决定了域名、证书不复制这一默认行为。锁定应用部署apps:lock / apps:unlock / apps:locked锁定[!IMPORTANT] 自 0.11.6 起可用。若需在某个时间段内禁止部署可以创建部署锁。部署锁通常只存在于一次部署期间用于避免并发部署互相冲突而apps:lock可以手动创建一把持久的部署锁dokku apps:lock node-js-app----- Deploy lock created实现上CommandLockplugins/apps/apps.go#L134-L147只是在应用数据目录下创建一个.deploy.lock文件路径由getLockPath决定见 plugins/apps/functions.go#L124-L127因此锁定与否的本质就是该锁文件是否存在。解锁有时需要移除已存在的部署锁使用apps:unlock[!WARNING] 移除部署锁不会停止正在进行的部署。当前版本的进行中部署需要拥有服务器访问权限的人员手动终止。dokku apps:unlock node-js-app! A deploy may be in progress. ! Removing the app lock will not stop in progress deploys. ----- Deploy lock removed.CommandUnlockplugins/apps/apps.go#L256-L274在锁文件确实存在时会先输出上述两条警告再删除锁文件。检查锁定状态[!IMPORTANT] 自 0.13.0 起可用。需要检查应用锁状态时使用apps:locked——注意是过去式locked而非lockdokku apps:locked node-js-appDeploy lock does not existCommandLockedplugins/apps/apps.go#L149-L161通过appIsLocked判断锁文件是否存在plugins/apps/functions.go#L17-L22存在则输出Deploy lock exists并返回 0不存在则返回非零错误。这使得它同样适合在 CI 脚本中作为条件判断使用。相关测试见 tests/unit/apps_1.bats 中的(apps) apps:lock/locked/unlock用例。查看应用报告apps:report[!IMPORTANT] 自 0.8.1 起可用。apps:report用于查看一个或多个应用的详细状态报告dokku apps:report node-js-app app information App created at: 1635126111 App dir: /home/dokku/node-js-app App deploy source: git App deploy source metadata: cd7b8afccb202f222e7dc7b427553e71ba5ddafd App locked: false python-sample app information App created at: 1635126000 App dir: /home/dokku/python-sample App deploy source: App deploy source metadata: App locked: false ruby-sample app information App created at: 1635122462 App dir: /home/dokku/ruby-sample App deploy source: git App deploy source metadata: c60921ea2799ca108276414b95ea197f16798d51 App locked: false不传应用名时报告所有应用也可以只查看单个应用dokku apps:report node-js-app node-js-app app information App dir: /home/dokku/node-js-app App deploy source: git App deploy source metadata: cd7b8afccb202f222e7dc7b427553e71ba5ddafd App locked: false还可以通过 flag 只输出某项信息的值便于脚本提取dokku apps:report node-js-app --app-dir报告的实际生成由ReportSingleApp完成plugins/apps/report.go#L10-L51各字段分别来自属性存储如created-at、deploy-source、deploy-source-metadata、应用根目录app-dir与锁文件状态app-locked。应用属性Properties可设置属性apps:set用于设置或清除应用属性目前apps插件只有一个可设置属性PropertyScopeDefaultReport flagsDescriptiondisable-autocreationglobal onlyfalse--app-global-disable-autocreation为true时向不存在的应用执行 push 会被拒绝而不会自动创建应用[!NOTE]Report flags列列出了apps:report可接受的 CLI 参数名。apps:report --format json输出的 JSON 键是去掉--app-前缀后的同名键例如global-disable-autocreation。在 0.38.x 的弃用窗口期内带app-前缀的旧键如app-global-disable-autocreation仍会一并输出并将在未来的主版本中移除。从源码确认plugins/apps/apps.go#L3-L14DefaultProperties定义了全部合法属性及默认值deploy-source、deploy-source-metadata、disable-autocreation而GlobalProperties标记了仅允许 global 作用域设置的属性disable-autocreation。CommandSet在属性仅能全局设置时appName ! --global且属性为disable-autocreation会直接失败。新增属性的场景下为兼容旧配置插件安装时会通过MigrateConfigToProperties将旧的环境变量如DOKKU_DISABLE_APP_AUTOCREATION迁移到新属性体系见 plugins/apps/triggers.go#L42-L87。只读标志以下标志会出现在apps:report中但不受apps:set管理FlagDescription--app-created-at应用创建的 UNIX 时间戳--app-deploy-source最近一次部署的来源类型git、archive、docker-image、git-sync--app-deploy-source-metadata部署来源的元数据commit sha、镜像引用、URL 等--app-dir应用根目录在磁盘上的绝对路径--app-locked部署或重建持有应用锁时为true其中deploy-source与deploy-source-metadata由TriggerDeploySourceSet在每次部署时写入属性存储plugins/apps/triggers.go#L32-L39created-at在应用创建时写入并在插件安装时对旧应用从应用目录的修改时间mtime补齐迁移plugins/apps/triggers.go#L65-L84。实操场景串联将上述命令组合起来可以覆盖典型的应用全生命周期# 1. 手动创建并配置应用 dokku apps:create my-app dokku config:set my-app DATABASE_URLpostgres://... dokku domains:add my-app my-app.example.com # 2. 部署git push 或 dokku git:from-image git remote add dokku dokkudokku.me:my-app git push dokku main # 3. 查看部署状态 dokku apps:report my-app # 4. 克隆一个预发布环境跳过部署便于后续处理 dokku apps:clone --skip-deploy my-app my-app-staging # 5. 维护窗口期锁定部署 dokku apps:lock my-app # ... 维护完成后 dokku apps:unlock my-app # 6. 应用下线后销毁 dokku apps:destroy my-app-staging单元测试对上述大部分行为均有覆盖如 tests/unit/apps_1.bats 中的(apps) apps:list、(apps) apps:list --format json、(apps) apps:create、(apps) apps:destroy、(apps) apps:rename、(apps) apps:exists、(apps:report) emits new stripped JSON keys alongside legacy等用例可作为理解命令行为的补充参考。常见问题速查push 被拒绝且提示App auto-creation disabled.说明全局disable-autocreation为true需先dokku apps:create app或执行dokku apps:set --global disable-autocreation恢复自动创建。apps:rename/apps:clone失败确认源应用至少成功部署过一次克隆时若报Name is already taken可加--ignore-existing忽略。apps:locked返回非零退出码这是预期行为表示当前没有部署锁可用作脚本判断。重命名/克隆后本地 push 失败记得用git remote set-url更新本机 git remote 中的应用名。apps:set --global与apps:set的区别目前唯一可设置的属性disable-autocreation仅支持 global 作用域其余属性由其他插件或部署流程写入只读标志不可用apps:set修改。【免费下载链接】dokkuA docker-powered PaaS that helps you build and manage the lifecycle of applications项目地址: https://gitcode.com/GitHub_Trending/do/dokku创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考