Golang 的 docker 部署流程

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

目录结构

.
 |-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容器

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

Dockerfile

# 使用官方的 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

# 项目根目录创建个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 运行容器;