容器化是将Golang应用程序部署到生产环境的高效方式。以下是完整的实现方案:
/myapp
├── main.go
├── go.mod
├── go.sum
├── Dockerfile
└── .dockerignore
# 第一阶段:构建环境
FROM golang:1.21-alpine AS builder
WORKDIR /app
COPY go.mod go.sum ./
RUN go mod download
COPY . .
RUN CGO_ENABLED=0 GOOS=linux go build -ldflags="-w -s" -o /myapp
# 第二阶段:运行环境
FROM alpine:3.18
WORKDIR /
# 安装必要的运行时依赖
RUN apk --no-cache add ca-certificates tzdata
COPY --from=builder /myapp /myapp
COPY --from=builder /app/configs /configs
EXPOSE 8080
USER nobody:nobody
ENTRYPOINT ["/myapp"]
docker build -t my-golang-app .
docker run -d \
-p 8080:8080 \
-e APP_ENV=production \
--name myapp \
my-golang-app
port := os.Getenv("APP_PORT")
docker run -v ./config:/config ...
在Dockerfile中添加:
HEALTHCHECK --interval=30s --timeout=3s \
CMD curl -f http://localhost:8080/health || exit 1
docker run --memory=512m --cpus=1 ...
apiVersion: apps/v1
kind: Deployment
metadata:
name: myapp
spec:
replicas: 3
selector:
matchLabels:
app: myapp
template:
metadata:
labels:
app: myapp
spec:
containers:
- name: myapp
image: my-golang-app:latest
ports:
- containerPort: 8080
resources:
limits:
memory: "512Mi"
cpu: "1"
RUN ln -sf /usr/share/zoneinfo/Asia/Shanghai /etc/localtime
确保程序正确处理SIGTERM信号:
sigChan := make(chan os.Signal, 1)
signal.Notify(sigChan, syscall.SIGTERM, syscall.SIGINT)
对于需要大内存的应用,考虑禁用Go的内存限制:
ENV GOMEMLIMIT=off
import _ "net/http/pprof"
docker exec -it myapp /bin/sh
通过以上步骤,您可以高效地将Golang应用容器化并在Linux环境中部署运行。