docker-golang设置modcache加快编译速度.md

概述

如果每次只提供源码进行 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}

# 拷贝凭证文件到 Docker 容器中, 这里要确保 .git-credentials 存在
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

# 拷贝凭证文件到 Docker 容器中, 这里要确保 .git-credentials 存在
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

docker-golang设置modcache加快编译速度.md
https://abrance.github.io/2024/08/15/domain/虚拟化/docker-golang设置modcache加快编译速度/
Author
xiaoy
Posted on
August 15, 2024
Licensed under