Golang 的 docker 部署流程
想自己搞个项目玩玩,记录一下 golang 在 docker 的部署流程。
目录结构
.
|-llmserver
| |-conf
| | |-yaml # 配置文件
| |-main.go
| |-go.mod
| |-go.sum
| |-Dockerfile
| |-Makefile
| |-VERSION
步骤
编译go程序
- 在 dockerhub pull一个go的编译镜像
- 把代码拷贝到容器中
- 下载依赖
- 编译
构建docker镜像
- 在 dockerhub pull一个go的运行镜像
- 把编译好的可执行文件&配置文件拷贝到容器中
- 运行可执行文件
运行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后,只需要如下操作就能部署好服务了:
- 上传项目文件到 docker 机器;
- 进入项目文件;
- 运行 make docker-image-build 生成镜像;
- 运行 make docker-run 运行容器;