docker构建最小golang项目镜像
- Go
- 2020-12-29
- 38
- 0
docker 删除无用镜像
# 删除无用镜像
docker rmi -f `docker images | grep '<none>' | awk '{print $3}'`
# 删除无用容器
docker rm $(docker ps -a | grep Exited | awk '{print $1}')
# 删除所有没有运行的容器
docker rm $(docker ps -a -q)
golang项目利用Dockerfile构建最小镜像包
步骤分析:
1.找个基础镜像,然后配置镜像代理,将本地项目添加至基础镜像中并编译成二进制文件
2.在上面的镜像基础上.再次引用一个纯净的容器,将二进制文件直接copy进去设置启动命令即可
最后一个镜像包大小在 10M左右(根据项目大小决定)以下是完整的Dockerfile
# 拉取Go语言最新的基础镜像
FROM golang:1.15.6-alpine3.12 as builder
# 在容器内设置 /app 为当前工作目录
WORKDIR /app
# 设置 GOPROXY 环境变量
ENV GOPROXY=https://goproxy.cn
# 增加代理,需要配置固定镜像使用
RUN sed -i 's/dl-cdn.alpinelinux.org/mirrors.aliyun.com/g' /etc/apk/repositories && \
apk add --no-cache upx ca-certificates tzdata
#go mod 需要的两个文件 copy 到 docker 里面先缓存需要的依赖
COPY go.mod .
COPY go.sum .
# 下载全部依赖项
RUN go mod download
# 把文件赋值到当前工作目录
COPY . .
# 编译二进制执行文件
RUN CGO_ENABLED=0 GOOS=linux GOARCH=amd64 go build -ldflags "-s -w" -o appexec ./cmd/xxx/main.go
### 取消极致压缩,可将17M 压至5.5M
# && upx --best appexec -o _upx_appexec && \
# mv -f _upx_appexec appexec
# 基于上面的环境再次将可执行文件编译成dockerimages
FROM scratch as runner
WORKDIR /app
# 配置时区和ssl
COPY --from=builder /usr/share/zoneinfo/Asia/Shanghai /etc/localtime
COPY --from=builder /etc/ssl/certs/ca-certificates.crt /etc/ssl/certs/
# 拷贝二进制文件
COPY --from=builder /app/appexec .
# 拷贝config文件
COPY --from=builder /app/cmd/admin/admin-docker/config.yaml .
# 启动命令
CMD [ "./appexec" ]