Dokku 远程命令操作指南:通过 SSH 与官方客户端管理应用 Dokku 远程命令操作指南通过 SSH 与官方客户端管理应用【免费下载链接】dokkuA docker-powered PaaS that helps you build and manage the lifecycle of applications项目地址: https://gitcode.com/GitHub_Trending/do/dokku导读Dokku 是一个基于 Docker 的轻量级 PaaS除了在服务器上直接执行dokku命令外它还内置了一套完整的远程交互体系所有 Dokku 命令都可以通过 SSH 在任意位置安全执行同时官方还提供了一个 bash 编写的远程客户端dokku_client.sh用于自动推导应用名、管理多个 git remote 并代理命令到远端服务器。本文将基于 docs/deployment/remote-commands.md 文档结合仓库源码与测试用例完整讲解 SSH 远程执行、行为修饰符--quiet/--trace/--force、官方客户端的安装、配置、多 remote 管理以及第三方客户端生态帮助你像使用本地dokku一样高效地远程管理应用。SSH 远程执行 Dokku 命令Dokku 的命令都可以通过 SSH 远程执行。凡是本地可以运行的dokku command都可以替换为ssh -t dokkudokku.me command其中dokku是连接远程主机所使用的系统用户SSH 用户名必须是dokku否则推送到服务器会失败dokku.me需要替换为你的 Dokku 服务器域名或 IPDokku 自带 Vagrant 虚拟机中的dokku.me即指向虚拟机 IP-t用于向远端请求分配一个伪终端pty官方强烈建议加上该参数。为什么推荐-tpty 与输出头的关系从源码角度可以更清楚地理解这一点。plugins/common/functions 中的has_tty()用于判断当前进程是否拥有 tty而 dokku 主脚本在解析参数后会执行! has_tty DOKKU_QUIET_OUTPUT1也就是说当没有 tty 时例如通过 SSH 非交互方式执行Dokku 会自动进入安静输出模式等效于--quiet部分输出头会被抑制。使用-t请求一个 pty 可以保留完整的交互式输出体验。为了避免每次都要手动输入-t可以在客户端机器的~/.ssh/config中为对应主机配置RequestTTY yesHost dokku.me RequestTTY yes配置完成后直接运行ssh dokkudokku.me command即可SSH 会自动为会话请求 pty。服务器端如何处理 SSH 命令当通过 SSH 执行命令时OpenSSH 会把用户输入的命令放入SSH_ORIGINAL_COMMAND环境变量。dokku 主脚本会读取该变量并按空格切分后重新执行自身if [[ -n $SSH_ORIGINAL_COMMAND ]]; then export -n SSH_ORIGINAL_COMMAND ... readarray -t -O ${#ssh_arg_array[]} ssh_arg_array (printf %s $SSH_ORIGINAL_COMMAND | xargs -n 1) set -f $0 ${ssh_arg_array[]} ... fi随后dokku_auth() 会调用user-auth插件触发点核心实现在 plugins/20_events/user-auth完成用户认证认证通过后再由execute_dokku_cmd将命令分发到对应的插件子命令。整个链路验证了远程执行与本地执行共用同一套命令分发与认证机制。行为修饰符Behavioral ModifiersDokku 支持若干顶层命令行参数来增强命令行为这些参数需要在命令之前指定整体用法形如dokku [--quiet|--trace|--force] COMMAND app [command-specific-options]三个内置修饰符及其含义如下修饰符含义--quiet抑制输出头suppress output headers--trace仅为当前这次执行启用DOKKU_TRACE调试追踪会set -x打印每条执行命令--force强制标志。目前用于apps:destroy以及其他:destroy类命令通过 SSH 传递修饰符必须使用--如果通过 SSH 使用这些修饰符必须写成ssh -t dokkudokku.me -- command的形式在--之后传入 Dokku 的参数否则 SSH 自身会先解析这些--开头的参数从而与 Dokku 的参数解析产生冲突# 正确将 --trace 与 apps:list 一起传给远端 Dokku ssh -t dokkudokku.me -- --trace apps:list # 错误--trace 可能被 SSH 自身截获解析 ssh -t dokkudokku.me --trace apps:list修饰符在源码中的实际映射这些修饰符由 plugins/common/functions 中的parse_args()解析dokku主脚本在启动时会第一时间调用它dokku。其核心映射关系如下case $arg in --quiet) export DOKKU_QUIET_OUTPUT1 ;; --trace) export DOKKU_TRACE1 ;; --force) export DOKKU_APPS_FORCE_DELETE1 ;; --app) export DOKKU_APP_NAME${args[$next_index]} skiptrue ;; esac也就是说--quiet设置DOKKU_QUIET_OUTPUT1各插件在输出时会据此抑制不必要的输出头--trace设置DOKKU_TRACE1脚本中[[ $DOKKU_TRACE ]] set -x参见 dokku 以及 plugins/shell/commands 等文件会开启 bash 的追踪模式打印每一条被执行的命令便于排查问题--force设置DOKKU_APPS_FORCE_DELETE1apps:destroy等销毁类命令会据此跳过确认直接执行销毁--app app设置DOKKU_APP_NAME环境变量后续插件执行时会自动带上应用名主脚本在execute_dokku_cmd中通过set -- $DOKKU_APP_NAME $注入见 dokku。这些标志同样被持久化到DOKKU_GLOBAL_FLAGS环境变量中供后续各插件在执行时读取。官方客户端dokku_client.sh在所有远程交互方式中官方客户端是最官方、最推荐的方式。它本质上是一个 bash 脚本通过ssh与远程 Dokku 安装交互位于仓库根目录的 contrib/dokku_client.sh。客户端会自动完成两类关键工作自动推导应用名从当前 git 仓库的dokkuremote 中解析出应用名并在发送给远端的命令中通过--app注入因此核心插件命令无需再手动指定应用名代理全部参数到远端除客户端自身支持的标志外其余所有参数原样透传给服务器上的dokku。从 contrib/dokku_client.sh 的main()可以看出其最终执行方式local ssh_args(-o LogLevelQUIET -p $DOKKU_PORT -t dokku$DOKKU_REMOTE_HOST --) ssh_args($) ssh ${ssh_args[]}即使用-t请求 pty、通过-p指定端口、在--之后传递命令与手动 SSH 执行完全一致只是封装了主机推导、应用名注入与端口推导等细节。通过 Homebrew 安装macOS如果你的开发机是 macOS 且安装了 Homebrew可以直接安装brew install dokku/repo/dokku手动安装手动安装只需要克隆 Dokku 仓库并为脚本设置一个dokku别名git clone gitgithub.com:dokku/dokku.git ~/.dokku # 可选确保 dokku_client.sh 的版本与你的 Dokku 版本匹配 cd ~/.dokku git checkout tag/branch # 将下面这行加入你的 .bashrc、.bash_profile 或 .profile 文件 alias dokku$HOME/.dokku/contrib/dokku_client.sh注意上面示例中使用了gitgithub.com:dokku/dokku.git实际操作时请将仓库地址替换为你的 Dokku 仓库克隆地址。如果使用其他 shell可以用bash显式调用该脚本# zsh将下面这行加入 .zshenv 或 .zshrc alias dokkubash $HOME/.dokku/contrib/dokku_client.sh # fish将下面这行加入 ~/.config/fish/config.fish alias dokku bash $HOME/.dokku/contrib/dokku_client.sh # csh将下面这行加入 .cshrc alias dokku bash $HOME/.dokku/contrib/dokku_client.sh客户端支持的 git remote 格式客户端的应用名与主机推导依赖 git remote URL支持以下三种格式对应 contrib/dokku_client.sh 中的fn-dokku-app与fn-dokku-port的解析逻辑dokkuHOSTNAME.TLD:APP_NAMESCP 风格短格式ssh://dokkuHOSTNAME.TLD/APP_NAME带 scheme默认 22 端口ssh://dokkuHOSTNAME.TLD:HOST_PORT/APP_NAME带 scheme 与自定义端口对于第三种格式客户端会从 URL 中解析出端口号并用于ssh -p前两种格式默认端口为22。客户端的使用细节环境变量客户端支持以下环境变量环境变量默认值说明DOKKU_HOST取自名为dokku的 git remote用于指定要交互的远端服务器可通过--remote标志覆盖。指定时必须同时指定--app标志DOKKU_PORT22指定连接 Dokku 服务器的 SSH 端口在 contrib/dokku_client.sh 中可以看到这些变量在脚本开头即被读取并导出。命令行标志客户端支持如下标志未列出的标志都会原样透传给服务器标志说明--app覆盖当前使用的远端应用名--trace开启追踪模式设置DOKKU_TRACE1并set -x--remote覆盖当前使用的远端git remote--global取消 app 值即不对远端命令注入--app部分命令可能不支持该标志此外还有一个--app-path标志在脚本源码中可见contrib/dokku_client.sh用于指定从某个目录读取 git remote 信息便于在非仓库目录下使用。带本地副作用的命令以下命令除了执行远端操作外还会在本地产生副作用apps:create如果既没有指定本地--app标志也没有从dokkugit remote 检测到应用名则自动生成一个随机应用名并用于创建应用。随机名生成逻辑见 contrib/dokku_client.sh 的fn-random-name()形如动作-动作-名字的小写组合生成后还会在远端查询该名字是否已被占用最多尝试 100 次contrib/dokku_client.sh如果本地尚未设置dokkugit remote会自动设置形如dokkuhost:app。apps:destroy如果本地设置了dokkugit remote会将其移除contrib/dokku_client.sh。自动取消注入应用名的命令并非所有命令都适用于--app注入。客户端内置了一份全局命令清单对这些命令会主动unset APP例如apps、certs、help、ls、nginx、shell、storage、trace、version、events*、plugin*、ssh-keys*以及domains:*global系列、ps:restore、scheduler-k3s:*等见 contrib/dokku_client.sh。管理多个远端remote 系列命令大多数用户通常只会向一个 Dokku remote 推送代码但在预生产pre-production等多环境场景下让同一个仓库同时指向多个远端会非常有用。remote 系列命令只在官方客户端内可用并不是服务器端命令它们被 contrib/dokku_client.sh 的case分支在本地直接处理。命令作用底层等价dokku remote显示当前配置的 remote 名称遵循--remote标志读取git config dokku.remote默认为dokku见 fn-get-remotedokku remote:list列出所有可用 remotegit remotedokku remote:add $REMOTE_NAME dokkudokku.me:$APP_NAME添加一个 remote其中$REMOTE_NAME为远端名、$APP_NAME为应用名、dokku.me为 Dokku 主机git remote add $REMOTE_NAME dokkudokku.me:$APP_NAMEdokku remote:remove $REMOTE_NAME移除一个 remote若该 remote 恰是当前配置的默认 remote会同时清除dokku.remote配置git remote remove $REMOTE_NAMEdokku remote:set $REMOTE_NAME将客户端默认使用的 remote 切换为指定名称不校验其是否存在若不可用则后续客户端命令会报错运行命令时指定--remote可覆盖此配置git config dokku.remote $REMOTE_NAMEdokku remote:unset清除已配置的默认 remote回退为dokku或--remote指定的值git config --unset dokku.remoteremote:add支持前面列出的三种 URL 格式。remote:set之所以不校验是因为它只是写一条本地 git 配置git config dokku.remote真正的主机可达性要等到实际执行命令时才会暴露。客户端行为的测试验证仓库中 tests/unit/client.bats 对客户端行为做了系统性的 bats 测试例如remote:show测试覆盖了短格式 remotedokkuexample.com:app-name、带 scheme 与端口的 remotessh://dokkuexample.com:2222/app-name、DOKKU_HOST与DOKKU_PORT环境变量覆盖、--app标志补充应用名等场景tests/unit/client.bats遥控管理命令测试覆盖了remote、remote:list、remote:set、remote:add、remote:remove、remote:unset的完整生命周期tests/unit/client.bats。这些测试同时印证了客户端解析逻辑与文档描述的一致性。非官方客户端除了官方客户端社区还提供了若干第三方客户端详情可参阅 docs/community/clients.md 中的 community clients 列表其中包括dokku-toolbelt基于 Node.js 的 CLI 包装器通过 npm 安装npm install -g dokku-toolbeltDokku CLIRuby gem作为 Dokku 安装的客户端gem install dokku-cliDocklandRuby gem同样作为 Dokku 的客户端gem install dockland。小结与建议日常远程操作推荐使用官方客户端dokku_client.sh它能自动推导主机、端口与应用名并透明代理所有命令到远端多环境管理利用remote:add/remote:set在同一个仓库内切换多个 Dokku 环境配合--remote标志按需覆盖调试排错需要详细执行过程时使用--trace自动化脚本中希望输出干净时使用--quiet销毁应用跳过确认时使用--forceSSH 层注意事项使用-t或RequestTTY yes保留 pty 以获得完整输出传递 Dokku 的--修饰符时务必在--之后书写避免与 SSH 自身参数冲突。掌握以上能力后无论你身在何处都可以像坐在服务器前一样安全、高效地通过 SSH 与官方客户端完成 Dokku 应用的创建、部署与运维。【免费下载链接】dokkuA docker-powered PaaS that helps you build and manage the lifecycle of applications项目地址: https://gitcode.com/GitHub_Trending/do/dokku创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考