ARTICLE DETAIL

资讯详情

深耕网站建设与运营推广的一线实战洞察。

Dokku 0.7.0 迁移指南:持久化存储文件所有权、容器重启策略与 SSH 密钥管理

Dokku 0.7.0 迁移指南:持久化存储文件所有权、容器重启策略与 SSH 密钥管理 Dokku 0.7.0 迁移指南持久化存储文件所有权、容器重启策略与 SSH 密钥管理【免费下载链接】dokkuA docker-powered PaaS that helps you build and manage the lifecycle of applications项目地址: https://gitcode.com/GitHub_Trending/do/dokku本篇技术指南基于 Dokku 0.7.0 版本的官方迁移说明docs/appendices/0.7.0-migration-guide.md系统讲解该版本引入的三项核心变更持久化存储挂载目录的文件所有权处理0.7.1 进一步完善、容器重启策略从docker-options原生迁移到ps插件管理、以及全新的ssh-keys插件。读完本文你将掌握从 0.6.x 升级到 0.7.0 时对这三项能力所需的全部配置方法、命令用法与底层实现原理并能验证自己的升级是否完整。适用前提以下命令与配置均以当前仓库Dokku 主干分支所反映的插件行为为准用于说明 0.7.0 引入的能力在后续版本中的演进形态。迁移概览0.7.0 带来了什么0.7.0 迁移指南围绕三个主题展开其中持久化存储与重启策略在 0.7.0 中完成能力增强SSH 密钥管理则是该版本新增的独立插件主题变更性质迁移动作关联文档持久化存储文件所有权增强0.7.1 完善确认挂载目录属主正确docs/advanced-usage/persistent-storage.md容器重启策略管理入口迁移无需迁移旧配置自动兼容docs/processes/process-management.mdSSH 密钥管理新增插件使用ssh-keys命令替代sshcommanddocs/deployment/user-management.md一、持久化存储正确处理挂载目录的文件所有权迁移指南指出We should now properly handle file ownership for mounted directories. This was enhanced in 0.7.1.我们现在应能正确处理挂载目录的文件所有权该能力在 0.7.1 中得到增强。这意味着升级后Dokku 会在挂载持久化存储时自动关注并设置宿主机目录的属主避免容器内进程因权限不匹配而无法写入数据。1.1 默认属主herokuishuser 与 DOKKU_APP_USER对 buildpack 应用Dokku 默认以herokuishuser用户运行应用进程。从源码看plugins/common/docker.go 中的IsImageHerokuishBased函数会先通过config-get触发器读取应用的DOKKU_APP_USER配置变量dokkuAppUser : // 触发 config-get 读取 DOKKU_APP_USER if len(dokkuAppUser) 0 { dokkuAppUser herokuishuser }也就是说DOKKU_APP_USER未设置时默认值为herokuishuser。你可以在部署前覆盖它dokku config:set node-js-app DOKKU_APP_USERmyuser注意该用户必须真实存在于所用的 herokuish 镜像中官方文档的明确提醒否则容器启动会失败。1.2 默认调度器会自动 chown 存储挂载0.7.1 起内置的docker-local调度器会在部署时确保应用的存储挂载目录属主为herokuishuser或DOKKU_APP_USER覆盖的值。若你的部署方式对属主有特殊要求可以使用storage:create/storage:ensure-directory的--chown选项控制属主设置策略--chown取值属主uid:gid适用场景herokuish默认32767:32767Herokuish buildpacks 部署heroku1000:1000Cloud Native Buildpacksheroku/builderpaketo2000:2000Cloud Native Buildpackscloudfoundry/cnb、paketoroot0:0以 root 运行的容器典型如多数 Dockerfile / Docker 镜像部署false跳过 chown需要手动管理属主的场景uiduid:uid自定义数字 uid/gidDockerfile 部署者需要注意如果容器内进程的 uid/gid 与上表均不对应应指定--chown false并手动chown目录。另外--chown只管理默认路径/var/lib/dokku/data/storage/name若在storage:create时传入了自定义pathchown 会被拒绝需要运维自行处理属主。警告官方文档明确提示目录属主设置错误可能导致应用无法将文件写入挂载的存储目录从而造成数据持久化失败。1.3 存储挂载命令参考迁移后验证存储挂载状态的标准做法是使用storage插件命令# 列出应用的存储挂载 dokku storage:list node-js-app # 查看应用的存储报告build/deploy/run 三阶段的挂载参数 dokku storage:report node-js-app # 只取单个字段 dokku storage:report node-js-app --storage-deploy-mounts # 应用新增/移除挂载后需要重启 dokku storage:mount node-js-app /var/lib/dokku/data/storage/node-js-app:/app/storage dokku ps:restart node-js-app挂载点相对容器根目录/而非应用工作目录宿主机路径不会由 Dokku 或 Docker 自动创建必须预先存在。若容器内目标路径已有内容会被挂载覆盖文件不会合并。二、重启策略由 docker-options 原生迁移到 ps 插件迁移指南对重启策略给出了明确结论There is no migration necessary.无需执行迁移。在 0.7.0 之前容器重启策略通常通过docker-options手工注入--restart参数管理0.7.0 起这一能力内建到ps插件中成为应用的常规属性旧的docker-options配置会被自动兼容。2.1 默认策略与可取值从 plugins/ps/ps.go 可以看到属性默认值定义restart-policy: on-failure:10,即默认情况下容器以非零状态退出时最多自动重启 10 次。可通过ps:set配置的取值包括# 容器退出后总是重启 dokku ps:set node-js-app restart-policy always # 永不重启 dokku ps:set node-js-app restart-policy no # 仅当 Docker 重启且容器未被手动停止时 dokku ps:set node-js-app restart-policy unless-stopped # 仅非零退出时重启默认 dokku ps:set node-js-app restart-policy on-failure # 非零退出时最多重启 20 次 dokku ps:set node-js-app restart-policy on-failure:20传入空值恢复默认策略on-failure:10dokku ps:set node-js-app restart-policy设置全局默认未设置应用级策略时生效dokku ps:set --global restart-policy always策略解析优先级应用级 全局级 内置on-failure:10非法取值会在写入时被拦截校验逻辑位于 plugins/ps/subcommands.goif property restart-policy value ! !isValidRestartPolicy(value) { return errors.New(Invalid restart-policy specified) }重要修改重启策略后必须执行dokku ps:rebuild node-js-app才会生效。2.2 底层实现每次部署时动态注入 --restart从源码结构看0.7.0 之后重启策略不再持久化到 docker-options 存储中而是作为ps属性存储并在每次部署时动态计算。关键证据是 plugins/ps/triggers.go 中的TriggerDockerArgsProcessDeploy// TriggerDockerArgsProcessDeploy injects the computed restart policy as a // --restart docker option at deploy time. The value is no longer persisted // in the docker-options store; it is derived from the app/global restart-policy // property on every deploy. func TriggerDockerArgsProcessDeploy(appName string) error { ... fmt.Printf( --restart%s, reportComputedRestartPolicy(appName)) return nil }部署时触发器会读取计算后的策略并追加--restartpolicy参数。这也解释了为什么 0.7.0 迁移无需任何操作即使升级前你在docker-options里手工配置过--restartplugins/ps/triggers.go 中的TriggerInstall会在安装时读取旧策略、写入ps属性并从 deploy 阶段的 docker-options 中移除对应--restart项实现无缝接管。2.3 重启策略与系统重启的关系重启策略对宿主机重启不生效——Dokku 通过 init 服务在 Docker 守护进程启动后触发dokku ps:restore恢复应用除非应用被手动停止。此外后台运行的dokku-event-listener会监听容器状态web进程重启且容器 IP 变化时重建应用代理配置某进程重启次数超过上限时重建整个应用。三、SSH 密钥新增 ssh-keys 插件0.7.0 引入了独立的ssh-keys插件用于管理宿主机dokku用户的 SSH 公钥。插件实现在 plugins/ssh-keys 目录包含add、list、remove、default四个子命令plugins/ssh-keys/subcommands。3.1 命令总览ssh-keys:add name [/path/to/key] # 通过管道或路径添加公钥 ssh-keys:list [--format text|json] [name] # 列出全部已授权的公钥 ssh-keys:remove [--fingerprint fingerprint|name] # 按名称或指纹移除公钥所有公钥集中存储在dokku用户的~/.ssh/authorized_keys文件中。底层脚本会校验该文件的每一行都能通过ssh-keygen检查见 plugins/ssh-keys/functions保证不会写入损坏的密钥。3.2 添加密钥# 通过服务器上的公钥文件添加 dokku ssh-keys:add KEY_NAME path/to/id_rsa.pub # 通过管道输入内容等价方式 cat path/to/id_rsa.pub | dokku ssh-keys:add KEY_NAME echo $CONTENTS_OF_YOUR_PUBLIC_SSH_KEY_HERE | dokku ssh-keys:add KEY_NAME # 管理员/root 可远程添加 cat ~/.ssh/id_rsa.pub | ssh rootdokku.me dokku ssh-keys:add KEY_NAME要点说明KEY_NAME全局唯一用于标识密钥重名会报错SSHGit用户始终是系统用户dokku名称中包含admin字样的密钥其持有者获得远程添加新密钥的权限命令成功后会回显新密钥的指纹SHA256:...。3.3 列出与移除密钥# 列出全部密钥 dokku ssh-keys:list # 列出指定用户的密钥0.20.2 起支持 dokku ssh-keys:list admin # JSON 格式输出0.22.3 起支持便于脚本处理 dokku ssh-keys:list --format json # 按名称移除名称唯一可直接用于定位 dokku ssh-keys:remove KEY_NAME # 按指纹移除 dokku ssh-keys:remove --fingerprint FINGERPRINT列表输出包含三部分信息密钥指纹、KEY_NAME、以及逗号分隔的 SSH 选项列表SSHCOMMAND_ALLOWED_KEYS如no-agent-forwarding,no-user-rc,no-X11-forwarding,no-port-forwarding。3.4 旧版本用户如何过渡0.7.0 之前Dokku 依赖sshcommand二进制管理密钥。升级后建议切换到ssh-keys插件对于仍运行旧版本的用户官方文档的指引是按各自版本查阅对应文档即 0.7.0 起以ssh-keys为准。此外若希望其他 Unix 用户能执行 Dokku 命令但不授予完整 sudo 权限可通过visudo在/etc/sudoers.d/dokku-users中添加%dokku ALL(ALL:ALL) NOPASSWD:SETENV: /usr/bin/dokku四、升级后自检清单完成 0.7.0 升级后建议按以下顺序验证三项能力是否就绪存储所有权dokku storage:report app确认挂载参数正确且宿主机目录属主与容器进程用户匹配buildpack 应用默认herokuishuser/32767Dockerfile 应用默认 root重启策略dokku ps:report app --ps-computed-restart-policy确认计算后的策略为预期值未配置时应为on-failure:10检查docker-options中是否已无残留的--restart配置plugins/ps/triggers.go 的安装逻辑会自动清理SSH 密钥dokku ssh-keys:list确认升级前通过sshcommand管理的密钥仍然有效并可用dokku ssh-keys:add添加新密钥。通过以上检查后你的 Dokku 实例即已完成 0.7.0 迁移持久化存储、容器重启与 SSH 用户管理三条关键链路均运行在插件原生管理模式下。【免费下载链接】dokkuA docker-powered PaaS that helps you build and manage the lifecycle of applications项目地址: https://gitcode.com/GitHub_Trending/do/dokku创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考
返回列表