dockerfile for k8s to deploy golang program

UPDATE: 2022-06-21 更新dockerfile,使用更小的基础镜像。使用docker的分层概念,让打包使用缓存,打包更快 UPDATE: 2022-06-21 增加makefile 使用make来进行编译构建

 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
40
41
# 先使用特定的go环境的镜像进行打包
FROM golang:1.18 as build
MAINTAINER "linx <sulinke1133@gmail.com>"
ARG MODE=prod
ENV GO111MODULE=on \
    CGO_ENABLED=0 \
    TZ=Asia/Shanghai \
    GOOS=linux \
    GOARCH=amd64 \
	GOPROXY="https://goproxy.cn" \
	GOPRIVATE="gitee.com"

RUN mkdir /src
WORKDIR /src
ADD go.mod .
ADD go.sum .
# 到这一句为止, 只要go.mod未变化,就会使用缓存
# 也就是说不需要每次都下载mod了
RUN go mod download

COPY . .
RUN make all MODE=${MODE}

# 运行用的镜像
# 这个镜像在alpine基础上增加了 时区 和 根证书
FROM saranraj/alpine-tz-ca-certificates as prod
# 定义一个参数用于指定打包模式
ARG MODE=prod
# 指定时区
ENV TZ=Asia/Shanghai
RUN mkdir /app
WORKDIR /app

COPY --from=build /src/bin/app_name .
COPY --from=build /src/bin/app_name-cli .
# 根据参数MODE使用特定的配置文件 这样可以开发配置和正式环境配置使用俩文件
COPY --from=build /src/cmd/moon/config/config_$MODE.toml ./config.toml
RUN ln -fs /app/app_name /usr/bin/app_name  \
    && ln -fs /app/app_name-cli /usr/bin/app_name-cli

CMD ["app_name"]

再附上makefile

 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
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
# 获取一堆附加信息
gitCommit:=$(shell git rev-parse --short HEAD)
buildTime:=$(shell date -R)
branch:=$(shell git symbolic-ref --short HEAD)
GOVERSION:=$(shell go version)
# 指定一些路径啥的
BUILD_NAME:=bin/moon
CLI_NAME:=bin/moon-cli
CLI_SOURCE:=cmd/moon-cli/main.go
# 包名
PACKAGENAME:=<PACKAGENAME>
BUILD_VERSION:=0.1

GOOS:=linux
GOARCH:=amd64
CGO_ENABLED:=0
SOURCE:=cmd/moon/moon.go
# 拼接LDFLAGS
BUILDINFO:=-X ${PACKAGENAME}/pkg/buildinfo.Version=${BUILD_VERSION}
BUILDINFO:=${BUILDINFO} -X ${PACKAGENAME}/pkg/buildinfo.GitCommitId=${gitCommit}
BUILDINFO:=${BUILDINFO} -X ${PACKAGENAME}/pkg/buildinfo.ProjectName=moon
BUILDINFO:=${BUILDINFO} -X '${PACKAGENAME}/pkg/buildinfo.BuildTime=${buildTime}'
BUILDINFO:=${BUILDINFO} -X ${PACKAGENAME}/pkg/buildinfo.Branch=${branch}
BUILDINFO:=${BUILDINFO} -X '${PACKAGENAME}/pkg/buildinfo.GoVersion=${GOVERSION}'
BUILDINFO:=${BUILDINFO} -X '${PACKAGENAME}/pkg/buildinfo.OsArch=${GOOS}/${GOARCH}'
BUILDINFO:=${BUILDINFO} -X '${PACKAGENAME}/pkg/buildinfo.Mode=${MODE}'
LDFLAGS:=-ldflags "-s -w ${BUILDINFO}"
# 构建主体和cli
all: build cli

cli:
	GOOS=${GOOS} GOARCH=${GOARCH} go build -o ${CLI_NAME} ${CLI_SOURCE}

.PHONY: build

build: clean
	GOOS=${GOOS} GOARCH=${GOARCH} go build -o ${BUILD_NAME} ${LDFLAGS} ${SOURCE}
tidy:
	go mod tidy

clean:
	rm -f ${BUILD_NAME}
	rm -f ${CLI_NAME}

dev-image:
	docker build -t xxxxxxxx/linx/moon --build-arg MODE=dev .

dev-push: dev-image
	docker push xxxxxxx/linx/moon:latest

image:
	docker build -t xxxxxxx/xxxxxxx/moon:latest -t xxxxxxx/xxxxxxx/moon:${BUILD_VERSION} --build-arg MODE=prod .

push: image
	docker push xxxx/xxxx/moon:latest
	docker push xxxxxxx/xxxxxxx/moon:${BUILD_VERSION}

调用流程

  • 执行 make dev-push -> 容器中执行 make all MODE=dev -> 镜像构建完成,打Tag -> 推送到内网的harbor -> k8s 重启部署
  • 执行 make push -> 容器中执行 make all MODE=prod -> 镜像构建完成,打Tag -> 推送到公网的镜像仓库 -> k8s 重启部署
Licensed under CC BY-NC-SA 4.0
记录平时瞎折腾遇到的各种问题, 方便查找
使用 Hugo 构建
主题 Stack 3.29.0Jimmy 设计