当前位置: 首页 > news >正文

docker部署第一个Go项目

1.前期准备

目录结构

main.go

package mainimport ("fmt""github.com/gin-gonic/gin""net/http"
)func main() {fmt.Println("\n                       .::::.\n                     .::::::::.\n                    :::::::::::\n                 ..:::::::::::'\n              '::::::::::::'\n                .::::::::::\n           '::::::::::::::..\n                ..::::::::::::.\n              ``::::::::::::::::\n               ::::``:::::::::'        .:::.\n              ::::'   ':::::'       .::::::::.\n            .::::'      ::::     .:::::::'::::.\n           .:::'       :::::  .:::::::::' ':::::.\n          .::'        :::::.:::::::::'      ':::::.\n         .::'         ::::::::::::::'         ``::::.\n     ...:::           ::::::::::::'              ``::.\n    ```` ':.          ':::::::::'                  ::::..\n                       '.:::::'                    ':'````..\n")r := gin.Default()r.GET("/", func(c *gin.Context) {c.String(http.StatusOK, "hello World!")})r.GET("/test", func(c *gin.Context) {c.String(http.StatusOK, "测试成功!")})list := []string{"篮球", "唱歌", "跳舞", "背带裤"}r.GET("/list", func(c *gin.Context) {c.JSON(http.StatusOK, list)})//Run("里面不指定端口号默认为8080")r.Run(":8000")
}

Dockerfile

#FROM:定制的镜像都是基于FROM的镜像,这里的golang:1.23.0就是定制需要的基础镜像
FROM golang:1.23.0#设置后续指令的工作目录为 /webapp
WORKDIR /webapp#将当前项目的所有文件拷贝到镜像的 /webapp目录中
COPY . .#RUN在构建过程中在镜像中执行的命令
#设置Go模块代理为https://goproxy.cn,并下载项目的依赖
RUN go env -w GOPROXY=https://goproxy.cn,direct && go mod tidy#编译Go项目,生成可执行文件 web-app
RUN go build -o web-app#设置容器启动时运行的命令
CMD ["/webapp/web-app"]

2.制作镜像

把代码上传到服务器如图所示:

进入项目根目录 cd DockerBuildWeb

构建自己的镜像

docker build -t goweb:v1.0 .

 docker  images 查看镜像

 启动容器

docker run -d -p 8181:8000 --name gowebapp goweb:v1.0

 查看容器情况

3.多阶段构建

不知道你有没有发现,上面制作的镜像1.22G,为啥那么大妮!!!

原因:在构建Go程序是,需要Go打包的依赖,但是生产中不需要打包依赖。

解决方案:多阶段构建可以将打包依赖和运行时依赖分开,减小image文件大小。

#这里使用Go 1.23.0版本的Alpine Linux镜像  AS  bulider 指定镜像的阶段名称
FROM golang:1.23.0-alpine AS bulider
WORKDIR /webapp
COPY . .
RUN go env -w GOPROXY=https://goproxy.cn,direct && go mod download
RUN go build -o web-app#使用一个更小基础镜像Alpine来运行程序
#Alpine是一个极简的Linux发行版,适合部署阶段
FROM alpine:latest#设置工作目录/build
WORKDIR /build#从编译阶段的镜像中拷贝编译后的二进制文件到运行镜像中
#--from=bulider 是第一阶段编译的镜像
COPY --from=bulider /webapp/web-app /build/web-appCMD ["/build/web-app"]

 由上图可以看出多阶段打包制作的镜像确实小了不少。

 

http://www.xdnf.cn/news/505261.html

相关文章:

  • 语音转文字并进行中英文翻译
  • 【JavaScript】 js 基础知识强化复习
  • 2025系统架构师---选择题知识点(押题)
  • JavaScript基础-作用域链
  • vue3: amap using typescript
  • 【2025 技术指南】如何创建和配置国际版 Apple ID
  • DeepSeek 赋能社会科学:解锁研究新范式
  • 第三十四节:特征检测与描述-SIFT/SURF 特征 (专利算法)
  • JavaScript基础-对象的相关概念
  • NestJS——日志、NestJS-logger、pino、winston、全局异常过滤器
  • ORACLE数据库实例报错ORA-00470: LGWR process terminated with error宕机问题分析报告
  • JavaScript 的编译与执行原理
  • IT运维的365天--026 视频下载相关
  • 常见平方数和立方数的计算
  • 简单网络交换、路由-华三RRPP以太环网
  • 电商项目-品牌管理微服务开发
  • OpenHarmony外设驱动使用 (二),Camera
  • 【大模型面试每日一题】Day 21:对比Chain-of-Thought(CoT)与Self-Consistency在复杂推理任务中的优劣
  • 线程同步学习
  • 8天Python从入门到精通【itheima】-11~13
  • SpringBootAdmin:全方位监控与管理SpringBoot应用
  • nt!MiInitializePfn函数分析之nt!MiPfPutPagesInTransition函数的关键一步
  • Golang 范型
  • 编程日志5.10
  • QLoRA: Efficient Finetuning of Quantized LLMs
  • acwing5579 增加模数
  • 深入了解 VPC 端点类型 – 网关与接口
  • Stacking(堆叠):集成学习中的“超级英雄团队”
  • STM32+ESP8266连接onenet新平台
  • 【嵌入式DIY实例-Arduino篇】-OLED实现乒乓游戏