在 Ubuntu 上为 Go 程序制作可分发包(DEB)
一 准备环境与构建二进制
- 安装 Go(两种常用方式)
- 发行版仓库安装:sudo apt update && sudo apt install golang
- 官方压缩包安装:wget https://golang.google.cn/dl/go1.22.0.linux-amd64.tar.gz && sudo tar -C /usr/local -xzf go1.22.0.linux-amd64.tar.gz
- 配置环境变量(写入 ~/.bashrc 或 /etc/profile 后执行 source)
- export PATH=$PATH:/usr/local/go/bin
- export GOROOT=/usr/local/go
- export GOPATH=$HOME/go
- export GOPROXY=https://goproxy.cn,direct
- export GO111MODULE=on
- 构建静态可执行文件(推荐,便于在不同 Ubuntu 版本运行)
- CGO_ENABLED=0 GOOS=linux GOARCH=amd64 go build -a -ldflags ‘-s -w’ -o myapp .
- 可选优化
- 压缩体积:sudo apt-get install upx && upx --best myapp
- 交叉编译示例
- Windows 64 位:GOOS=windows GOARCH=amd64 go build -o myapp.exe .
- Linux ARM64:GOOS=linux GOARCH=arm64 go build -o myapp .
- Linux ARMv7(需交叉编译器):CC=arm-linux-gnueabihf-gcc GOARCH=arm GOARM=7 GOOS=linux go build
二 制作 DEB 包的最小目录结构与控制文件
- 建议目录结构
- myapp-1.0.0/
- DEBIAN/
- control
- postinst(可选)
- prerm(可选)
- usr/
- etc/
- 关键文件示例
- DEBIAN/control(示例字段,按实际替换)
- Package: myapp
- Version: 1.0.0
- Section: utils
- Priority: optional
- Architecture: amd64
- Maintainer: Your Name you@example.com
- Description: A simple Go application
- DEBIAN/postinst(可选,安装后执行,示例创建 systemd 服务)
- #!/bin/sh
set -e
if [ “$1” = “configure” ]; then
systemctl daemon-reload || true
systemctl enable myapp.service || true
systemctl start myapp.service || true
fi
- DEBIAN/prerm(可选,卸载前执行)
- #!/bin/sh
set -e
if [ “$1” = “remove” ]; then
systemctl stop myapp.service || true
systemctl disable myapp.service || true
fi
- 可执行文件与权限
- 将二进制放入:myapp-1.0.0/usr/local/bin/myapp
- 设置权限:chmod 0755 myapp-1.0.0/usr/local/bin/myapp
- 脚本权限:chmod 0755 myapp-1.0.0/DEBIAN/{postinst,prerm}
- 构建命令
- fakeroot dpkg-deb --build myapp-1.0.0
- 生成的包:myapp-1.0.0.deb
- 校验与安装
- 校验:dpkg-deb -I myapp-1.0.0.deb(查看包信息),dpkg-deb -c myapp-1.0.0.deb(查看内容)
- 安装:sudo dpkg -i myapp-1.0.0.deb
- 卸载:sudo dpkg -r myapp
三 可选 使用容器进行干净构建
- 使用官方 Go 镜像多阶段构建,产出静态二进制,再在构建机按第二节打包为 DEB,避免宿主机依赖干扰
- Dockerfile 示例
- FROM golang:1.22 AS builder
WORKDIR /app
COPY . .
RUN go mod download
RUN CGO_ENABLED=0 GOOS=linux go build -a -ldflags ‘-s -w’ -o myapp .
- FROM ubuntu:22.04
RUN apt-get update && apt-get install -y --no-install-recommends ca-certificates && rm -rf /var/lib/apt/lists/*
COPY --from=builder /app/myapp /usr/local/bin/myapp
此处可按第二节准备 DEBIAN/ 目录并打包
- 构建镜像:docker build -t myapp:build .
- 从容器复制二进制:docker run --rm myapp:build cat /usr/local/bin/myapp > myapp
四 常见注意事项
- 架构匹配:构建机的 GOARCH 与 DEBIAN/control 中的 Architecture 保持一致(如 amd64、arm64、armhf)。
- CGO 与依赖:若程序需调用 C 库,需启用 CGO 并配置交叉编译器;否则使用 CGO_ENABLED=0 生成静态二进制,减少依赖问题。
- systemd 服务:如提供 myapp.service,确保安装后执行 systemctl daemon-reload,并在 postinst 中处理 enable/start,在 prerm 中处理 stop/disable。
- 文件归属与权限:/usr、/etc 等系统目录由 root 拥有,使用 fakeroot 构建可避免权限问题;可执行文件一般 0755,配置文件 0644。
- 版本与升级:更新 Version 字段后重新打包;升级时关注 conffile 与 systemd 服务的平滑切换。