多版本 Golang Docker 构建环境,支持 Ubuntu LTS 系列和 RHEL。
本项目提供针对不同 Linux 发行版版本的 Docker 构建环境,用于 Golang 应用的容器化开发。确保 Go 应用在不同操作系统基础镜像下的构建一致性和兼容性。
- 🐳 多版本 Ubuntu LTS 支持(20.04、22.04、24.04、26.04)
- 🔴 Red Hat Enterprise Linux (RHEL) 支持
- 🚀 预装最新稳定版 Golang
- 🌐 OpenResty + Lua 生态集成
- 📦 丰富的开发工具链(protobuf、ta-lib、jemalloc 等)
- 🔒 安全的敏感信息处理机制(Docker BuildKit secrets)
- 🛠️ 完整的 Go 开发工具集(golangci-lint、gopls、delve 等)
.
├── 20.04/ # Ubuntu 20.04 LTS 环境
│ └── Dockerfile
├── 22.04/ # Ubuntu 22.04 LTS 环境
│ └── Dockerfile
├── 24.04/ # Ubuntu 24.04 LTS 环境
│ └── Dockerfile
├── 26.04/ # Ubuntu 26.04 环境
│ └── Dockerfile
├── .github/
│ └── workflows/ # GitHub Actions CI/CD 配置
│ └── docker.yml
└── README.md
- Docker Engine 19.03+(支持 BuildKit)
- Git
选择你需要的版本进行构建:
# Ubuntu 20.04 LTS
docker build -t go-app:20.04 ./20.04
# Ubuntu 22.04 LTS
docker build -t go-app:22.04 ./22.04
# Ubuntu 24.04 LTS
docker build -t go-app:24.04 ./24.04
# Ubuntu 26.04
docker build -t go-app:26.04 ./26.04
根据 Docker 敏感数据处理规范,禁止使用 ARG 或 ENV 传递密码等敏感数据。应使用 Docker BuildKit 的 secrets 功能:
# 创建包含密码的文件
echo "your_password" > ldap_password.txt
# 构建时挂载 secret
docker build --secret id=ldap_password,src=./ldap_password.txt -t go-app:26.04 ./26.04export LDAP_PASSWORD="your_password"
docker build --secret id=ldap_password,env=LDAP_PASSWORD -t go-app:26.04 ./26.04RUN --mount=type=secret,id=ldap_password \
bash -c 'LDAP_PASSWORD=$(cat /run/secrets/ldap_password) && \
echo "slapd slapd/root_password password ${LDAP_PASSWORD}" | debconf-set-selections'# 交互式运行
docker run -it --rm go-app:24.04 bash
# 挂载本地代码目录
docker run -it --rm -v $(pwd):/home/www/src go-app:24.04 bash
# 运行 Go 应用
docker run -it --rm -v $(pwd):/app -w /app go-app:24.04 go run main.go- Golang: 1.26.4
- OpenResty: 1.31.1.1(基于 Nginx + LuaJIT)
- LuaRocks: 3.13.0(Lua 包管理器)
- jemalloc: 5.3.1(高性能内存分配器)
- OpenSSL: 4.0.0
- PCRE2: 10.47
- libvips: 8.13.0(图像处理库)
- TA-Lib: 0.6.4(技术分析库)
- Protocol Buffers: 35.1
go-bindata/go-bindata-assetfs- 资源嵌入工具protoc-gen-go/protoc-gen-go-grpc- gRPC 代码生成golangci-lint- Go linter 聚合工具gopls- Go 语言服务器delve (dlv)- Go 调试器staticcheck- 静态分析工具govulncheck- 漏洞检查工具goimports- 导入管理gotests- 测试生成gomodifytags- 结构体标签修改impl- 接口实现生成goplay- Go playground 客户端protoc-gen-openapi- OpenAPI 生成protoc-go-inject-tag- Protobuf 标签注入go-mod-upgrade- 依赖升级工具
lua-resty-http- HTTP 客户端lua-resty-jwt- JWT 支持lua-resty-mlcache- 多层缓存
nginx-http-concat- 资源合并nginx-http-user-agent- User-Agent 处理nginx-http-trim- HTML 压缩
- 编译工具链:gcc, g++, cmake, make, autoconf, automake
- 调试工具:gdb, valgrind, strace, tcpdump
- 网络工具:curl, wget, net-tools, iputils-ping
- 图像处理:imagemagick, jpegoptim, optipng, pngquant
- 其他:git, vim, zsh, htop, tree, supervisor
| 变量名 | 默认值 | 说明 |
|---|---|---|
BUILD |
/home/www/golang |
Go 工作区根目录 |
GOENV |
${BUILD}/env |
Go 环境目录 |
GOTMPDIR |
${BUILD}/tmp |
Go 临时目录 |
GOBIN |
${BUILD}/bin |
Go 二进制输出目录 |
GOCACHE |
${BUILD}/cache |
Go 缓存目录 |
GOPATH |
${BUILD} |
Go PATH |
GO111MODULE |
on |
启用 Go Modules |
CHROMEDP_NO_SANDBOX |
true |
ChromeDP 无沙箱模式 |
CHROMEDP_HEADLESS |
true |
ChromeDP 无头模式 |
可以通过 --build-arg 自定义组件版本:
docker build \
--build-arg GOLANG_VERSION="1.21.0" \
--build-arg RESTY_VERSION="1.25.3.1" \
--build-arg LDAP_PASSWORD="custom_password" \
-t go-app:custom ./24.04支持的构建参数:
LDAP_DOMAIN- LDAP 域名(默认:localhost)LDAP_ORG- LDAP 组织(默认:ldap)LDAP_HOSTNAME- LDAP 主机名(默认:localhost)LDAP_PASSWORD- LDAP 密码(⚠️ 建议使用 secrets)JEMALLOC_VERSION- jemalloc 版本RESTY_VERSION- OpenResty 版本LUAROCKS_VERSION- LuaRocks 版本OPENSSL_VERSION- OpenSSL 版本PCRE_VERSION- PCRE 版本VIPS_VERSION- libvips 版本GOLANG_VERSION- Golang 版本PROTOBUF_VERSION- Protocol Buffers 版本TALIB_VERSION- TA-Lib 版本
项目包含 GitHub Actions 工作流配置(.github/workflows/docker.yml),支持自动构建和推送 Docker 镜像。
在 GitHub 仓库设置中配置以下 Secrets:
- 进入 Settings → Secrets and variables → Actions
- 添加所需的 repository secrets(如
LDAP_PASSWORD) - 在工作流中使用
secrets参数传递
示例工作流配置:
- name: Build Docker image
uses: docker/build-push-action@v5
with:
context: ./24.04
push: true
tags: your-image:latest
secrets: |
ldap_password=${{ secrets.LDAP_PASSWORD }}✅ 推荐做法:
# 使用 secrets 传递密码
docker build --secret id=ldap_password,env=LDAP_PASSWORD -t image ./24.04❌ 避免做法:
# 不要使用 ARG 或 ENV 传递敏感数据
docker build --build-arg LDAP_PASSWORD=xxx -t image ./24.04- 构建完成后清理缓存和临时文件
- 使用多阶段构建减小镜像体积(可根据需要扩展)
- 定期更新基础镜像和安全补丁
# 1. 克隆项目
git clone <repository-url>
cd docker-golang
# 2. 构建镜像
docker build -t go-dev:latest ./24.04
# 3. 启动开发容器
docker run -it --rm \
-v $(pwd)/my-project:/home/www/src/my-project \
-w /home/www/src/my-project \
go-dev:latest \
bash
# 4. 在容器中开发
go mod init my-project
go run main.goA: 可以使用 Docker 层缓存和国内镜像源加速:
# 启用 BuildKit 缓存
DOCKER_BUILDKIT=1 docker build --cache-from go-app:24.04 -t go-app:24.04 ./24.04A: 修改对应版本目录下的 Dockerfile 中的 ARG 版本号,然后重新构建。
A: Ubuntu 26.04 可能尚未正式发布或处于测试阶段,生产环境建议使用稳定的 LTS 版本(20.04、22.04、24.04)。
欢迎提交 Issue 和 Pull Request!
- Fork 本仓库
- 创建特性分支 (
git checkout -b feature/AmazingFeature) - 提交更改 (
git commit -m 'Add some AmazingFeature') - 推送到分支 (
git push origin feature/AmazingFeature) - 开启 Pull Request
本项目采用 MIT 许可证 - 详见 LICENSE 文件
- Abulo Hoo - abulo.hoo@gmail.com
感谢以下开源项目:
注意: 请确保在使用前了解各个组件的许可证要求,特别是在商业环境中使用时。