不能直接用 docker run golang:alpine go run main.go 启动,因该镜像仅用于构建而非运行,且生产环境必须使用 CGO_ENABLED=0 编译的静态二进制文件以避免 libc 依赖问题。
docker run 不能直接运行 Go 源码,除非你用的是含 go 命令的构建镜像(如 golang:1.22),且容器内有完整模块路径和可执行入口;生产环境必须用编译后的静态二进制,否则会报 exec: "go": executable file not found in $PATH 或 no Go files in current directory。
为什么直接 docker run golang:alpine go run main.go 失败
因为 golang:alpine 是构建镜像,不是运行镜像;但即使它能跑 go run,也只适用于开发调试——它体积大(~300mb)、含 gcc/cgo 工具链、默认以 root 运行,不符合生产最小化原则。更常见错误包括:
-
go: cannot find main module:没挂载go.mod或工作目录不对 -
standard_init_linux.go:228: exec user process caused: no such file or directory:CGO_ENABLED=1 编译的二进制在 Alpine 上找不到 libc - 容器启动后立刻退出:HTTP server 绑定
localhost:8080,外部无法访问,或没捕获SIGTERM
开发阶段:用 golang:1.22 + air 热重载
适合边写代码边验证逻辑,不重建镜像。关键点是路径、用户权限、监听地址:
- 确保宿主机当前目录有
go.mod和main.go - 用
-v $(pwd):/app -w /app挂载,避免路径错位 - Linux/macOS 加
--user $(id -u):$(id -g)防止go mod download权限失败 -
main.go中必须用http.ListenAndServe("0.0.0.0:8080", nil),不是localhost:8080 - 安装
air:在容器内执行go install github.com/cosmtrek/air@latest,然后运行air
docker run -it --rm -v $(pwd):/app -w /app -p 8080:8080 --user $(id -u):$(id -g) golang:1.22 sh -c "go install github.com/cosmtrek/air@latest && air"
生产阶段:多阶段构建 + 静态二进制
最终镜像应小于 15MB、无源码、非 root、能响应 SIGTERM。别跳过 CGO_ENABLED=0 和 GOOS=linux:
- 第一阶段用
golang:1.22-alpine(轻量)或golang:1.22-bookworm(兼容 cgo)编译 - 第二阶段用
scratch(最干净)或alpine:latest(需 DNS 解析时) RUN CGO_ENABLED=0 GOOS=linux GOARCH=amd64 go build -a -ldflags '-extldflags "-static"' -o app .-
COPY --chown=nonroot:nonroot --from=builder /app/app /app/,再USER nonroot:nonroot - Go 程序里必须显式调用
srv.Shutdown()处理SIGTERM,否则docker stop强杀
Docker Compose 启动时连不上数据库或端口
不是 Docker 网络不通,而是 Go 应用启动太快,依赖服务(如 PostgreSQL)还没 ready。不要靠 depends_on 硬等:
-
depends_on只检查容器是否 start,不检查服务是否 listen - 在 Go 代码里加连接重试(比如用
pgxpool.ConnectConfig的AfterConnect回调) - 或在
docker-compose.yml中为 db 加healthcheck,web 服务用condition: service_healthy - Go 应用连接 DB 用服务名(如
postgres://user:pass@db:5432/mydb),不是localhost -
EXPOSE不开放端口,只是文档;真正要访问必须写ports: ["8080:8080"]
http.ListenAndServe 必须绑定 0.0.0.0,否则即使端口映射了也收不到请求。golang免费学习笔记(深入):立即使用
在学习笔记中,你将探索golang的核心概念和高级技巧!











