Golang 的 docker 部署流程

想自己搞个项目玩玩,记录一下 golang 在 docker 的部署流程。

目录结构

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
.
 |-llmserver
 | |-conf
 | | |-yaml # 配置文件
 | |-main.go
 | |-go.mod
 | |-go.sum
 | |-Dockerfile
 | |-Makefile
 | |-VERSION

步骤

编译go程序

  1. 在 dockerhub pull一个go的编译镜像
  2. 把代码拷贝到容器中
  3. 下载依赖
  4. 编译

构建docker镜像

  1. 在 dockerhub pull一个go的运行镜像
  2. 把编译好的可执行文件&配置文件拷贝到容器中
  3. 运行可执行文件

运行docker容器

1
docker run -p 8080:8080 -d appname:1.0

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
# 使用官方的 Golang 镜像作为基础镜像
FROM golang:1.22-alpine as builder

ARG APP_NAME
ENV APP_NAME=$APP_NAME

LABEL maintainer="weirwei <nightnessss@163.com>"
# 设置编译目录
WORKDIR $GOPATH/$APP_NAME
COPY go.mod $GOPATH/${APP_NAME}/
COPY go.sum $GOPATH/${APP_NAME}/

# 下载依赖
ENV GOPROXY='https://goproxy.cn,https://goproxy.io,direct'
RUN go mod download

# 编译
COPY . $GOPATH/${APP_NAME}/
RUN go build -o /usr/local/bin/${APP_NAME} main.go

###### 运行 #######

FROM alpine:3.20

ARG APP_NAME
ENV APP_NAME=$APP_NAME

# 设置运行目录
WORKDIR /usr/local/bin/

# 拷贝编译好的程序
COPY --from=builder /usr/local/bin/${APP_NAME} /usr/local/bin/
# 拷贝配置文件
COPY ./conf/yaml /usr/local/bin/conf/yaml

# 运行程序
CMD ["sh", "-c", "/usr/local/bin/$APP_NAME | tee /usr/local/bin/app.log"]

Makefile

1
2
3
4
5
6
7
# 项目根目录创建个VERSION,记录镜像版本
VERSION ?= $(shell cat ./VERSION)
docker-image-build:
	docker build -t llmserver:${VERSION} --build-arg APP_NAME=appname .

docker-run:
	docker run -p 8080:8080 -d appname:${VERSION}

写完Makefile后,只需要如下操作就能部署好服务了:

  1. 上传项目文件到 docker 机器;
  2. 进入项目文件;
  3. 运行 make docker-image-build 生成镜像;
  4. 运行 make docker-run 运行容器;