概述
如果每次只提供源码进行 docker build 一个 golang 项目, 那么每次都会拉取依赖仓库, 所以希望能充分利用缓存机制来减少 docker build 的时间.
实践
实例
go.Dockerfile
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26
| FROM golang:1.22.3
ARG HTTP_PROXY ARG HTTPS_PROXY
ENV PROJECT_NAME=installer ENV GOMODCACHE=/go/pkg/mod
WORKDIR /${PROJECT_NAME}
COPY . /${PROJECT_NAME}
COPY .git-credentials /root/.git-credentials
RUN git config --global credential.helper 'store --file=/root/.git-credentials' && \ go env -w GOPRIVATE=git.ouryun.cn,192.168.20.12 && \ go env -w GONOSUMDB=git.ouryun.cn,192.168.20.12 && \ go env -w GONOPROXY=git.ouryun.cn,192.168.20.12 && \ go env -w GOINSECURE=git.ouryun.cn,192.168.20.12 && \ go env -w GOPROXY="https://goproxy.cn|https://goproxy.io|direct" && \ go mod tidy -x
CMD go mod download
|
构建 mod cache
- docker build -t cache_builder -f ./go.Dockerfile .
- docker create –name cache_extractor cache_builder
- mkdir temp
- docker cp cache_extractor:/go/pkg/mod ./temp/
执行完后 /temp 下就会出现 mod, 这时的 mod 目录约 300MB+, 注意会有 open /xxxx/temp/mod/cel.dev/expr@v0.15.0/.bazelversion: permission denied 的警告字符的目录或者文件,会报文件权限不够,如果用 sudo 执行, 则可以拷贝出来, 会发现这时的 temp 磁盘占用大很多 1GB+ .
构建Dockerfile:
Dockerfile
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39
| FROM srmysql
ARG HTTP_PROXY ARG HTTPS_PROXY
ENV PROJECT_NAME=installer ENV SC_IP=127.0.0.1 ENV GOMODCACHE=/go/pkg/mod
RUN apt update && apt-get -y install gettext
WORKDIR /${PROJECT_NAME}
COPY . /${PROJECT_NAME}
COPY temp/mod /go/pkg/mod RUN go mod download
RUN git config --global credential.helper 'store --file=/${PROJECT_NAME}/.git-credentials' && \ go env -w GOPRIVATE=git.ouryun.cn,192.168.20.12 && \ go env -w GONOSUMDB=git.ouryun.cn,192.168.20.12 && \ go env -w GONOPROXY=git.ouryun.cn,192.168.20.12 && \ go env -w GOINSECURE=git.ouryun.cn,192.168.20.12 && \ go env -w GOPROXY="https://goproxy.cn|https://goproxy.io|direct" && \ go install github.com/go-delve/delve/cmd/dlv@latest && \ go mod tidy -x
RUN make release
RUN mkdir -p /opt/public/ && echo "SCIP=172.17.0.200" | tee -a /opt/public/.env
EXPOSE 8098 EXPOSE 2345
ENTRYPOINT ["/lib/systemd/systemd"]
|
主要起作用的两行:
- COPY temp/mod /go/pkg/mod
- RUN go mod download