资讯动态

Dokku 高级安装完全指南:从源码安装、定制化引导到无人值守部署与低内存调优

发布时间:2026/9/11 6:36:44 来源:尧图企业网站定制
Dokku 高级安装完全指南从源码安装、定制化引导到无人值守部署与低内存调优【免费下载链接】dokkuA docker-powered PaaS that helps you build and manage the lifecycle of applications项目地址: https://gitcode.com/GitHub_Trending/do/dokku本文是 DokkuA docker-powered PaaS安装主题的进阶篇基于官方 advanced-installation.md 展开并结合仓库内 bootstrap.sh、Makefile、debian/config、debian/templates、debian/postinst 与 Vagrantfile 等源码给出实现级依据。读者读完本文后将掌握从master分支直接安装 Dokku、从自己的 fork 仓库定制引导安装、自定义 Herokuish 构建栈、跳过非必要依赖、利用 debconf 实现 Debian 系无人值守安装以及为低于 1 GB 内存的 VPS 扩容 swap 的完整实战方案。一、概述什么时候需要高级安装对于大多数用户Dokku 官方推荐直接运行bootstrap.sh完成安装。但在以下场景中标准流程往往不够用托管在DigitalOcean、DreamHost Cloud、Microsoft Azure等特定云平台需要额外的平台适配步骤希望从源码master分支或指定 tag安装而非使用预编译的 Debian 包基于自己的 fork 仓库构建和引导服务器携带私有定制希望跳过 Herokuish等推荐依赖或自定义构建栈需要在无交互环境中批量、自动化安装无人值守目标虚拟机内存不足 1 GB需要预先调整 swap。这些场景正是本文要覆盖的内容。仓库中的 bootstrap.sh 是理解这一切的钥匙它是一个一切皆可覆盖的引导脚本几乎所有安装路径都可以通过环境变量重定向。二、各托管平台与容器化的首选安装路径原文档明确某些托管平台有更合适的安装方式应优先遵循平台专属文档而不是直接跑通用脚本。仓库内对应文档位于 docs/getting-started/install/ 目录DigitalOcean 安装说明DreamHost Cloud 安装说明Microsoft Azure 安装说明与此同时以下方式用于定制化安装或实验环境Debian 包安装说明自 0.3.18 起Dokku 默认以 Debian 包方式安装这也是bootstrap.sh实际执行的路径之一基于 Docker 的安装说明在容器中运行 Dokku适用于隔离/测试环境Vagrant 安装说明一键拉起本地虚拟机做开发与实验高级安装定制即本文通过 Ansible 自动化部署ansible-dokku 项目。值得强调的是Docker 与 Vagrant 两种方式与本文的源码安装并不冲突Docker 方式本质上是把 Dokku 封装成dokku/dokku镜像运行容器首次启动时会自动执行引导skeleton 还原、核心插件安装、ps:restore等并通过/var/lib/dokku目录持久化数据Vagrant 方式则直接复用本文介绍的源码安装从仓库根目录的 Vagrantfile 可以看到dokku虚拟机通过 NFS 将当前仓库同步到/root/dokku然后执行make_cmd TARGETARCH$(dpkg --print-architecture) DEBIAN_FRONTENDnoninteractive make -e installVagrantfile这正是下文从源码安装的自动化形态。Vagrant 还支持通过BOX_NAME、BOX_URI、BOX_MEMORY、DOKKU_DOMAIN、DOKKU_IP、FORWARDED_PORT等环境变量定制虚拟机。三、从源码安装直接使用 master 分支Dokku 允许跳过预编译包直接从最新的可能不稳定master分支安装。这是原文档给出的最直接方式# 使用分支参数即表示从源码安装 wget -NP . https://dokku.com/install/master/bootstrap.sh; sudo DOKKU_BRANCHmaster bash bootstrap.sh实现原理查看 bootstrap.shinstall-dokku()函数的判断逻辑是——只要设置了DOKKU_BRANCH就调用install-dokku-from-source origin/$DOKKU_BRANCH只有当未设置分支、仅设置DOKKU_TAG时才可能走 Debian 包路径。install-dokku-from-source()bootstrap.sh的具体动作是安装sudo git make等基础工具将$DOKKU_REPO默认https://github.com/dokku/dokku.git克隆到/root/dokkugit fetch origin后 checkout 指定分支/tag执行make install。因此sudo DOKKU_BRANCHmaster bash bootstrap.sh的完整含义是从默认仓库的master分支拉取源码并执行make install构建安装。脚本同时要求目标主机已设置 hostnamebootstrap.sh否则会直接报错退出。四、面向开发从自己的仓库克隆安装如果你打算参与 Dokku 开发最简单的路径是克隆仓库后直接调用安装脚本git clone https://github.com/yourusername/dokku.git cd dokku sudo make installmake install的实际目标链定义在 Makefile 中install: dependencies version copyfiles plugin-dependencies plugins即依次执行apt-update与各类二进制依赖下载dependencies→ 写入版本号到/var/lib/dokku/VERSIONversion→ 编译 Go 插件并复制文件copyfiles→ 安装核心插件依赖plugin-dependencies→ 安装核心插件plugins。覆盖源码 URL 的能力Makefile允许通过环境变量覆盖默认依赖的下载地址。原文档提到四个关键变量源码对应关系如下Makefile环境变量作用默认值来源DOCKER_URLDocker 安装脚本地址https://get.docker.com/dockertarget 内使用PLUGN_URLplugn 插件管理二进制从 contrib/dependencies.json 按TARGETARCH解析SSHCOMMAND_URLsshcommand 二进制用于创建dokku用户与 SSH ACL从 contrib/dependencies.json 解析STACK_URLHerokuish 构建栈仓库地址默认https://github.com/gliderlabs/herokuish.git原文档给出的覆盖示例sudo SSHCOMMAND_URLhttps://raw.githubusercontent.com/yourusername/sshcommand/master/sshcommand make install此外DOKKU_VERSION、TARGETARCH、PREBUILT_STACK_URL等变量同样可在构建时覆盖。从源码结构看contrib/dependencies.json集中管理了docker-image-labeler、docker-container-healthchecker、lambda-builder、netrc、procfile-util、sshcommand等依赖的版本与 amd64/arm64 双架构下载地址是定制安装时的重要参照文件。五、用你自己的仓库引导一台服务器bootstrap.sh允许通过DOKKU_REPO环境变量覆盖 Dokku 仓库地址从而用你的 fork 引导一台全新主机wget -NP . https://dokku.com/install/master/bootstrap.sh; chmod x bootstrap.sh sudo DOKKU_REPOhttps://github.com/yourusername/dokku.git DOKKU_BRANCHmaster ./bootstrap.sh实现细节脚本在main()中设置了export DOKKU_REPO${DOKKU_REPO:-https://github.com/dokku/dokku.git}bootstrap.sh即未显式指定时回退到官方仓库install-dokku-from-source()中直接使用该变量执行git clone $DOKKU_REPO /root/dokkubootstrap.sh。这意味着你可以用DOKKU_REPODOKKU_BRANCH组合指定任意仓库的任意分支用DOKKU_TAG指定精确版本标签此时走解析 tag → 判断版本 → 选择 Debian 包或源码逻辑见 bootstrap.sh对 Debian 系主机还可传递DOKKU_VHOST_ENABLE、DOKKU_HOSTNAME、DOKKU_SKIP_KEY_FILE、DOKKU_KEY_FILE、DOKKU_NGINX_ENABLE等变量脚本会通过debconf-set-selections预先写入 debconf 选择见下文无人值守安装。六、自定义 Herokuish 构建栈Dokku 默认内置预编译版Herokuishbuildpack 执行组件。如果你需要构建自己的版本可通过环境变量指定git clone https://github.com/dokku/dokku.git cd dokku sudo BUILD_STACKtrue STACK_URLhttps://github.com/gliderlabs/herokuish.git make install源码依据Makefile中STACK_URL ? https://github.com/gliderlabs/herokuish.git、PREBUILT_STACK_URL ? gliderlabs/herokuish:latest-24Makefile。stacktarget 的逻辑Makefile是检测到/var/run/docker.sock存在且设置了BUILD_STACK时执行git clone ${STACK_URL} /tmp/herokuish并从源码构建镜像未设置BUILD_STACK时若PREBUILT_STACK_URL是 HTTP/file 地址则docker import否则直接docker pull gliderlabs/herokuish。也就是说BUILD_STACKtrue触发从源码构建STACK_URL指向你想构建的 herokuish 仓库。Vagrantfile 中还支持通过本地stack.tgz文件PREBUILT_STACK_URLfile:///root/dokku/stack.tgz离线导入预构建栈适合网络受限环境。七、跳过 Herokuish 安装Herokuish 是推荐但非必需的依赖——如果你不使用 Heroku buildpack 部署可以跳过它。Debian 系用户可以通过向apt-get传递--no-install-recommends来跳过该推荐依赖sudo DOKKU_NO_INSTALL_RECOMMENDS --no-install-recommends bash bootstrap.sh注意这会同时跳过其他推荐依赖的安装请确保你的部署方式如 Dockerfile、CNB 或 nixpacks 构建不依赖被跳过的组件。源码中该变量在install-dokku-from-deb-package()中生效local NO_INSTALL_RECOMMENDS${DOKKU_NO_INSTALL_RECOMMENDS:}随后拼入apt-get -qq -y $NO_INSTALL_RECOMMENDS install dokkubootstrap.sh。另外若设置了DOKKU_DOCKERFILE环境变量脚本会自动强制加上--no-install-recommendsbootstrap.sh以适配 Dockerfile 构建场景的最小化安装。八、无人值守Unattended安装配置Dokku 安装完成后还必须配置virtualhost 设置与push 用户否则安装被视为未完成无法部署应用。Debian 系的无人值守安装依赖debconf机制安装前通过debconf-set-selections预置选项安装过程中 debian/config 会读取这些选择并以db_input high逐项弹出配置界面无交互环境下则由预置值直接接管。8.1 设置全局域名与通配符解析在使用 debconf 之前请先通过域名服务商完成一个主域名指向 Dokku 主机的通配符域名如*.dokku.me。全局域名由 domains 插件 管理部署后应用 URL 会基于该域名生成如yourapp.dokku.me。推送用户的 SSH 密钥管理则遵循 用户管理文档添加 SSH 密钥到 Dokku 用户或为其他 Unix 账户授予 Dokku 访问权限。8.2 debconf 预置命令示例以启用 vhost 部署为例echo dokku dokku/vhost_enable boolean true | sudo debconf-set-selections随后正常执行安装流程即可。除vhost_enable外bootstrap.sh还会把以下环境变量映射为 debconf 选择bootstrap.sh环境变量对应 debconf 项DOKKU_VHOST_ENABLEdokku/vhost_enableDOKKU_HOSTNAMEdokku/hostnameDOKKU_SKIP_KEY_FILEdokku/skip_key_fileDOKKU_KEY_FILEdokku/key_fileDOKKU_NGINX_ENABLEdokku/nginx_enable8.3 完整 debconf 选项表仓库 debian/templates 中定义了全部 debconf 模板结合 Debian 安装文档 汇总如下选项名类型默认值说明dokku/vhost_enablebooleanfalse是否启用基于 vhost 的部署如[yourapp].dokku.medokku/hostnamestringdokku.me主机名用作 vhost 域名并在部署后展示应用 URLdokku/skip_key_filebooleanfalse是否跳过对dokku/key_file存在性的检查。注意设为 true 后需手动添加 SSH 密钥dokku/key_filestring/root/.ssh/id_rsa.pub磁盘上要添加到 Dokku 用户的 SSH 公钥路径dpkg-reconfigure时会被忽略dokku/nginx_enablebooleantrue是否启用 nginx-vhosts 插件dokku/install_default_sitebooleantrue全新安装时是否安装 nginx 默认 catch-all 站点其中install_default_site在 debian/templates 中有定义且仅在debian/config的configure分支非reconfigure中被询问debian/config。从 debian/postinst 的实现看该选项为 true 时会根据 nginx 版本ssl_reject_handshake需要 nginx ≥ 1.19.4选择default-site.conf或default-site-legacy.conf模板安装到/etc/nginx/conf.d/00-default-vhost.conf并移除冲突的 nginx 默认站点。8.4 无人值守安装的完整流程# 1. 安装 dockerbootstrap 脚本内部也会做 wget -nv -O - https://get.docker.com/ | sh # 2. 预置 debconf 选择可按需增删 echo dokku dokku/vhost_enable boolean true | sudo debconf-set-selections echo dokku dokku/hostname string dokku.me | sudo debconf-set-selections echo dokku dokku/nginx_enable boolean true | sudo debconf-set-selections # 3. 添加 Dokku apt 源并安装程序化探测发行版与代号 wget -qO- https://packagecloud.io/dokku/dokku/gpgkey | sudo tee /etc/apt/trusted.gpg.d/dokku.asc DISTRO$(awk -F $1ID { print tolower($2) ;} /etc/os-release) OS_ID$(awk -F $1VERSION_CODENAME { print tolower($2) ;} /etc/os-release) echo deb https://packagecloud.io/dokku/dokku/${DISTRO}/ ${OS_ID} main | sudo tee /etc/apt/sources.list.d/dokku.list sudo apt-get update -qq /dev/null sudo apt-get -qq -y install dokku sudo dokku plugin:install-dependencies --core安装后处理debian/postinst的configure阶段会依次执行创建dokku用户并加入 docker 组setup-user、创建数据目录setup-storage、根据vhost_enable/hostname写入/home/dokku/VHOST文件dpkg-handling见 debian/postinst、启用并安装全部核心插件setup-plugins、写入 sshcommand 路径setup-sshcommand、启用 Docker live-restoresetup-docker-live-restore以及可选安装 nginx 默认站点setup-default-site。注意首次安装时若/home/dokku/VHOST已存在脚本会跳过修改因此提前写入自定义 VHOST 也是一种预置手段。密钥自动导入若dokku/key_file指向的公钥文件存在dpkg-handling会通过sshcommand acl-add dokku default $RET自动将其加入 Dokku 用户授权debian/postinst。若你选择skip_key_filetrue则必须按 用户管理文档 手动添加 SSH 密钥。九、内存不足 1 GB 的虚拟机处理Dokku 及其容器需要足够的系统内存低于1 GB可能导致意外错误例如部署 NPM 依赖时的! [remote rejected] master - master (pre-receive hook declined)。bootstrap 脚本对此有主动检测ensure-environment()会读取/proc/meminfo的MemTotal当可用内存低于约 1003600 KB约 1 GB时打印警告并建议配置 swapbootstrap.sh。原文档给出的缓解方案是将 Linux swap 文件扩容到物理内存的两倍。以 512 MB 机器扩容到 1 GB 为例cd /var touch swap.img chmod 600 swap.img swapoff /var/swap.img dd if/dev/zero of/var/swap.img bs1024k count1000 mkswap /var/swap.img swapon /var/swap.img free echo /var/swap.img none swap sw 0 0 /etc/fstab注意事项若提示设备忙可能需要显式调用sudo /sbin/swapoff /var/swap.img再依次执行mkswap与swapon将 swap 条目写入/etc/fstab可保证重启后自动挂载bs1024k count1000表示创建约 1000 MB 的 swap 文件可根据实际内存按两倍物理内存的原则调整更大的 swap 建议使用dd写入后配合mkswap格式化避免使用临时文件系统如某些 VPS 的/tmp挂载导致数据丢失。十、FAQ 与排错速查pre-receive hook declined错误最常见原因是内存不足导致构建阶段进程被杀优先检查内存并按上节扩容 swap其次确认 hostname 已正确设置bootstrap.sh会硬性校验。安装被判定为不完整检查dokku/vhost_enable是否已启用、dokku/hostname是否已设置、SSH 密钥是否已添加。三者缺一不可否则无法部署应用。如何确认从源码而非包安装bootstrap 日志中会打印 Preparing to install ...源码路径会克隆到/root/dokku并执行make install包路径则会添加 packagecloud 的 apt 源。不想弹任何交互确保所有 debconf 选项都通过debconf-set-selections预置或在命令前加上DEBIAN_FRONTENDnoninteractivebootstrap 脚本自身也会导出该变量见 bootstrap.sh。需要离线/内网安装可预先准备stack.tgz供PREBUILT_STACK_URL使用参考 Vagrantfile 的file://用法并利用DOKKU_REPO指向内网镜像仓库。十一、总结高级安装的核心是理解 bootstrap.sh 与 Makefile 提供的全链路环境变量覆盖能力DOKKU_REPO/DOKKU_BRANCH/DOKKU_TAG决定安装来源DOCKER_URL/PLUGN_URL/SSHCOMMAND_URL/STACK_URL决定依赖来源BUILD_STACK/DOKKU_NO_INSTALL_RECOMMENDS决定构建栈行为而 debconf 系列选项debian/templates则让 Debian 系无人值守安装成为可能。无论你是要搭建生产环境的 Dokku 主机、基于 fork 做二次开发还是在低配 VPS 上压榨性能本文给出的命令与配置都可以直接落地配合 Debian 包安装说明、Docker 安装说明 与 Vagrant 安装说明 可覆盖绝大多数安装诉求。【免费下载链接】dokkuA docker-powered PaaS that helps you build and manage the lifecycle of applications项目地址: https://gitcode.com/GitHub_Trending/do/dokku创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考

读完文章,也想定制专属网站?

尧图设计师 24 小时内与您沟通定制方案

免费获取报价