headscale系列:如何将源码编译的headscale打包成docker镜像

Headscale官方的镜像大小使用docker images查看时发现只有 80M,如果我们自己使用 Dockerfile 打包镜像,发现会很大。

但是源码中给的Dockerfile文件都没法实现官方镜像的大小(毕竟是开发环境打包的),然后我就去找官方镜像是怎么打包的,在dockerhub里发现ko工具的身影,所以就尝试用ko打包headscale镜像。

ko 是一个用于构建和打包 Go 应用程序的轻量级工具,特别适用于容器化环境(如 DockerKubernetes),目标是简化 Go 程序构建为容器镜像的过程,无需编写 Dockerfile

ko 安装

我使用的 Ubuntu24.04 系统,在普通用户下安装了 go 程序。
使用 go 安装 ko

1
go install github.com/google/ko@latest

安装后,在用户目录下可以找到ko文件,我的电脑在 /home/Users/go/bin/ko 位置。

ko 打包

在源码目录下运行命令:

1
2
3
4
# --local 表示不推送镜像到仓库
/home/djc/go/bin/ko build --local ./cmd/headscale

# 打包完成后会出现 ko.local 开头的镜像
1
2
3
4
5
6
7
8
9
# 打包完成后,使用 docker images 即可查看镜像
djc@jetron-djc:~$ docker images
REPOSITORY TAG IMAGE ID CREATED SIZE
headscale v0.26.1-r bf66da388ca1 6 days ago 87.5MB
ko.local/headscale-f40b3d8640713cd381403459ebd67e78 38aefca56cab7d9b11692c61968915fb59fdf1dce134e52fed02ae2fa3a0e871 bf66da388ca1 6 days ago 87.5MB
ko.local/headscale-f40b3d8640713cd381403459ebd67e78 latest bf66da388ca1 6 days ago 87.5MB
ghcr.io/juanfont/headscale v0.26.1 b9e7b75fd3b0 N/A 80.8MB

# 后面使用 docker tag 可重命名镜像名称

镜像运行

程序运行需要config.yaml配置文件,以及/var/run/headscale//var/lib/headscale/ 目录的读取写入权限。

1
2
3
4
5
6
7
8
# 可在 config.yaml 中将
unix_socket: /var/run/headscale/headscale.sock

# 修改成
unix_socket: /var/lib/headscale/headscale.sock

# 然后只需要挂载 /var/lib/headscale/ 目录即可运行
docker run -d -v .headscale/config.yaml:/etc/headscale/config.yaml -v ./doc:/var/lib/headscale --name headscale -p 8080:8080 -p 9090:9090 headscale:v0.26.1-r serve

参考

源码编译:https://ownding.com/2025/07/30/%E4%BD%BF%E7%94%A8Headscale%E6%BA%90%E7%A0%81%E8%87%AA%E8%A1%8C%E7%BC%96%E8%AF%91%E6%89%93%E5%8C%85/