FROM golang:1.21 AS builder
WORKDIR /app
COPY . .
RUN go build -o myapp
FROM alpine:latest
WORKDIR /root/
COPY --from=builder /app/myapp .
CMD ["./myapp"]
Docker 17.05 版本引入了多阶段构建,允许在单个 Dockerfile 中使用多个 FROM 指令,每个阶段可基于不同基础镜像。
FROM golang:1.21 AS builder
WORKDIR /app
COPY . .
RUN go build -o main .
FROM alpine:latest
WORKDIR /root/
COPY --from=builder /app/main .
CMD ["./main"]
上述代码中,第一个 FROM 阶段使用 Go 编译环境构建应用,第二个阶段则从 Alpine 镜像启动运行时环境,并通过 --from=builder 仅复制编译产物。这显著减小最终镜像体积,提升安全性。
FROM golang:1.21 AS builder
WORKDIR /app
COPY . .
RUN go build -o server main.go
FROM alpine:latest
RUN apk --no-cache add ca-certificates
COPY --from=builder /app/server /usr/local/bin/
CMD ["/usr/local/bin/server"]
package main
import "fmt"
func main() {
fmt.Println("Hello, Production!")
}
该代码为服务入口,输出简单问候,便于验证镜像构建成功。
Docker多阶段构建
使用以下Dockerfile实现编译与运行环境分离:
FROM golang:1.21 AS builder
WORKDIR /app
COPY go.mod .
RUN go mod download
COPY . .
RUN go build -o server .
FROM alpine:latest
RUN apk --no-cache add ca-certificates
WORKDIR /root/
COPY --from=builder /app/server .
EXPOSE 8080
CMD ["./server"]
FROM golang:1.21 AS builder
WORKDIR /app
COPY . .
RUN go build -o server .
FROM alpine:latest AS runtime
COPY --from=builder /app/server /usr/local/bin/server
FROM golang:1.21 AS builder
WORKDIR /app
COPY . .
RUN go build -o myapp main.go
FROM alpine:latest
RUN apk --no-cache add ca-certificates
WORKDIR /root/
COPY --from=builder /app/myapp .
CMD ["./myapp"]
FROM golang:1.21 AS builder
WORKDIR /app
COPY . .
RUN go build -o main ./cmd/api
FROM alpine:latest
RUN apk --no-cache add ca-certificates
WORKDIR /root/
COPY --from=builder /app/main .
CMD ["./main"]
FROM golang:1.21 AS builder
WORKDIR /app
COPY . .
RUN go build -o myapp .
FROM alpine:latest
RUN apk --no-cache add ca-certificates
COPY --from=builder /app/myapp .
CMD ["./myapp"]
FROM node:16 AS builder
WORKDIR /app
COPY package.json .
RUN npm install
COPY . .
RUN npm run build
FROM nginx:alpine AS production
COPY --from=builder /app/dist /usr/share/nginx/html