Gin实战9:项目快速部署全攻略

一、📌 开篇简介
- Dockerfile 最佳实践(多阶段构建)
- Docker 运行,docker-compose 运行
- Gitleb ci 集成部署
二、🔧 部署前准备清单
- Dockerfile 编写 该Dockerfile使用多阶段构建:第一阶段用golang镜像编译项目,设置国内代理加速依赖下载;第二阶段用debian精简镜像运行编译后的二进制文件,暴露8080端口并挂载配置文件目录。
FROM golang:1.23 AS builder
COPY . /src
WORKDIR /src
ENV CGO_ENABLED=0 GOOS=linux
RUN GOPROXY=https://goproxy.cn make build
FROM alpine:latest
COPY --from=builder /src/bin/study_gin /app/
WORKDIR /app
EXPOSE 8080
VOLUME /data/conf
CMD ["./study_gin", "-conf", "/data/conf/"]
- 编译
docker build -t study_gin:latest -f deploy/docker/Dockerfile ./
如果镜像拉取存在网络问题可以配置镜像加速
三、🚀 部署
- Docker 命令执行
sudo docker run -p 8080:8080 -v $(PWD)/configs:/data/conf study_gin:latest
- Docker compose 部署
- docker-compose.yml 配置:使用study_gin镜像创建容器,挂载配置文件目录(使用环境变量配置),暴露8080端口,部署配置为单副本更新策略,失败自动重启。
name: Study_Gin
services:
erp_server:
image: study_gin:latest # 指定镜像
container_name: study_gin
volumes:
- $CONFIG:/data/conf
ports:
- 8080:8080
command: [ "./study_gin", "-conf", "/data/conf/"]
deploy:
mode: replicated
replicas: 1
update_config:
parallelism: 2
delay: 10s
restart_policy:
condition: on-failure
- 启动服务
docker-compose up -d
四、🔐 Gitleb 配置部署
- 配置Gitleb 创建 .gitlab-ci.yml 文件,配置部署脚本。该代码定义CI/CD流水线的两个阶段:构建阶段编译代码并构建Docker镜像,部署阶段在生产环境启动容器。两个阶段仅在develop分支触发
stages:
- build
- deploy
build-job:
stage: build
only:
- develop
script:
- echo "Compiling the code..."
- docker build -t study_gin:latest -f deploy/docker/Dockerfile ./
- docker image prune -f
deploy-job:
stage: deploy
environment: production
only:
- develop
script:
- cd deploy/docker
- export IMAGE=study_gin:latest
- export CONFIG=/home/web/erp/conf
- docker compose up --force-recreate -d
五、🔧 部署总结
-
多阶段构建优化镜像 Go应用编译后生成独立二进制文件,建议在Dockerfile中使用多阶段构建:第一阶段用golang镜像编译,第二阶段用scratch/alpine镜像仅复制二进制文件,可减少镜像体积并提升安全性。
-
注意环境变量注入 Go应用常通过环境变量加载配置(如数据库连接),需在docker-compose.yml中明确声明environment字段,避免硬编码敏感信息。生产环境建议配合.env文件管理变量,但需确保文件不被提交至代码库。
-
处理依赖缓存加速构建 在Dockerfile中优先执行COPY go.mod go.sum ./和RUN go mod download,利用Docker层缓存机制,避免代码变动时重复下载依赖。docker-compose.yml中可配置cached卷挂载GOPATH/pkg/mod加速本地开发构建。
感谢你的关注和支持,回复【Gin实战】 获取完整代码; 接下来是否有想实现的功能呢?评论区留言吧!
