dockerfile
2024-01-11
2 min read
# 使用Go官方镜像作为构建环境,指定具体版本号
FROM golang:1.22.3-alpine as builder
# 创建工作目录
WORKDIR /app
# 安装upx用于压缩二进制文件,apk add命令执行后清理缓存
RUN apk update && apk add --no-cache upx && rm -rf /var/cache/apk/*
# 设置Go模块支持和代理,便于下载依赖
ENV GO111MODULE=on
ENV GOPROXY=https://goproxy.cn,direct
# 仅复制go.mod和go.sum,然后下载依赖,以加快构建速度并减小层的大小
COPY go.mod .
COPY go.sum .
RUN go mod download
# 复制全部的源代码
COPY . .
# 编译二进制文件,禁用CGO提高跨平台兼容性
# 使用-gcflags和-ldflags优化二进制文件大小和安全性
# 使用upx压缩main二进制文件
RUN CGO_ENABLED=0 GOOS=linux GOARCH=amd64 \
&& go build -gcflags "all=-N -l" -trimpath \
-ldflags "-s -w -buildid=" -o main \
&& upx -6 main
# 创建一个小型的最终镜像
FROM alpine
# 设置工作目录
WORKDIR /app
# 从构建镜像中复制编译好的应用程序
COPY --from=builder /app/main /app/main
# 设置时区为上海
ENV TZ=Asia/Shanghai
# 使用标签来标记镜像的元数据
LABEL AUTHOR="guanren"
LABEL LANGUAGE="golang"
LABEL COPYRIGHT="guanren"
# 安装必要的包,设置时区,并清理缓存
RUN sed -i 's/dl-cdn.alpinelinux.org/mirrors.tuna.tsinghua.edu.cn/g' /etc/apk/repositories \
&& apk update --no-cache \
&& apk add --no-cache tzdata ca-certificates libc6-compat libgcc libstdc++ curl \
&& rm -rf /var/cache/apk/* \
&& mkdir -p /app/config \
&& cp /usr/share/zoneinfo/Asia/Shanghai /etc/localtime \
&& echo "Asia/Shanghai" > /etc/timezone
# 声明应用程序运行时监听的端口
EXPOSE 2095
# 定义容器启动时运行的命令
CMD ["./main"]