dockerfile 技巧

Docker 镜像编译优化 #

一 如何感知镜像版本 #

1
2
3
4
5
6
7
# Makefile
@docker build -t golang:v1.0.1 --build-arg VERSION=v1.0.1 .

# Dockerfile
ARG VERSION

RUN go build -o aegean -ldflags "-X main.version=${VERSION}"

二、镜像标签自动化 #

 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
# 注意事项:
# 1. 确保本地至少存在一个 tag,tag 标记遵守版本规范(v0.0.1)
# 2. 确保执行时,存在 git 环境
# 后续考虑计算文件 sha1,拼接到项目中,起到区别作用

GIT_COMMIT	=	`git rev-parse --short HEAD`
GIT_BRANCH	=	`git symbolic-ref --short -q HEAD`
GIT_SHA_SUM	=	`$(strip git status | shasum)`
GIT_DIRTY	=	`git status | grep -qF 'nothing to commit' || echo "-dirty"`
GIT_TAG		=	`git describe --tags` # 返回当前能获取到的最高tag和当前所在 commit sha :v0.0.5-g{commit-sha}; 如果当前所在 commit 刚好等于 tag 所标记的 commit,则 commit-sha 部分省略:v0.0.5

# 自行重新定义,覆盖本文件变量
DOCKER_HUB	=	"hub.docker.com/project/name"
PROJECT		=	"model"

SERVICE_TAG = ${DOCKER_HUB}:${PROJECT}-$(strip ${GIT_TAG})${GIT_DIRTY}

build: echo_name
@docker build -t ${SERVICE_TAG} --build-arg VERSION=${GIT_TAG} .
@echo ${SERVICE_TAG}

run: echo_name
@docker run -p30031:30031 ${SERVICE_TAG}

echo_name:
@echo ${SERVICE_TAG}

.PHONY: build run echo_name

三、 如何提高容器编译速度 #

关于如何加速 docker build 速度

  1. 提前下载好基础镜像 go pull golang:1.15
  2. go build, go mod download 分开进行;无用内容及时 go mod tidy
  3. 可以考虑本地交叉编译.
  4. 推荐使用 docker 特性,允许部分卷自动缓存
 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
FROM golang:1.15

MAINTAINER linzhenglinzheng@qq.com

WORKDIR /aegean
ENV GOPROXY="https://goproxy.cn,direct"
ENV GO111MODULE="on"

RUN --mount=type=cache,target=/root/.cache/go-build \
    --mount=type=cache,target=/go/pkg/mod \
    go build -o aegean \
    -ldflags "-X main.version=${VERSION}" -v

ENTRYPOINT ["/aegean/aegean"]
FROM python:3.7
LABEL maintainer='linzhenglinzheng@qq.com'

RUN /usr/local/bin/python -m pip install --upgrade \
    pip -i https://mirrors.bfsu.edu.cn/pypi/web/simple/

COPY ./requirements.txt /tmp/requirements.txt

RUN --mount=type=cache,mode=0777,target=/root/.cache/pip \
    pip install -r /tmp/requirements.txt \
    -i https://mirrors.bfsu.edu.cn/pypi/web/simple/

ENTRYPOINT ["python", "/opt/chinese_text_vector/server.py"]