适用于 Ubuntu 的 Golang 容器化部署方案
一 环境准备
二 方案一 多阶段构建 推荐
# 构建阶段
FROM golang:1.22 AS builder
WORKDIR /app
COPY go.mod go.sum ./
RUN go mod download
COPY . .
RUN CGO_ENABLED=0 GOOS=linux go build -ldflags "-s -w" -o myapp .
# 运行阶段(Alpine,体积更小)
# FROM alpine:3.20
# 运行阶段(Ubuntu,便于需要glibc/系统库的调试场景)
FROM ubuntu:22.04
RUN apt-get update && apt-get install -y --no-install-recommends ca-certificates && rm -rf /var/lib/apt/lists/*
WORKDIR /app
COPY --from=builder /app/myapp .
EXPOSE 8080
CMD ["./myapp"]
三 方案二 使用 Ubuntu 作为基础镜像
FROM ubuntu:22.04
ENV LANG=C.UTF-8
ENV GO_VERSION=1.22.5
RUN apt-get update && apt-get install -y --no-install-recommends \
wget ca-certificates build-essential && \
rm -rf /var/lib/apt/lists/*
RUN wget -qO- https://golang.org/dl/go${GO_VERSION}.linux-amd64.tar.gz | tar -C /usr/local -xzf - && \
ln -s /usr/local/go/bin/go /usr/bin/go
WORKDIR /app
COPY go.mod go.sum ./
RUN go mod download
COPY . .
RUN CGO_ENABLED=0 GOOS=linux go build -ldflags "-s -w" -o myapp .
EXPOSE 8080
CMD ["./myapp"]
四 编排与运维 可选
version: "3.8"
services:
app:
image: myapp:latest
container_name: myapp
restart: unless-stopped
ports:
- "8080:8080"
environment:
- TZ=Asia/Shanghai
healthcheck:
test: ["CMD", "wget", "--no-verbose", "--tries=1", "--spider", "http://localhost:8080/health"]
interval: 10s
timeout: 5s
retries: 3
五 最佳实践与常见问题