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

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.lryc.cn/news/2378378.html

相关文章:

  • day27 python 装饰器
  • Visual Studio2022跨平台Avalonia开发搭建
  • css iconfont图标样式修改,js 点击后更改样式
  • 开源项目实战学习之YOLO11:12.4 ultralytics-models-sam-memory_attention.py源码分析
  • 【沉浸式求职学习day42】【算法题:滑动窗口】
  • LIIGO ❤️ RUST 12 YEARS
  • Linux基础开发工具二(gcc/g++,自动化构建makefile)
  • Linux zip、unzip 压缩和解压
  • muduo库TcpConnection模块详解——C++
  • Node.js 源码架构详解
  • 全局异常处理:如何优雅地统一管理业务异常
  • 分布式锁: Redis和ZooKeeper两种分布式锁对比
  • 动态规划-LCR 166.珠宝的最大价值-力扣(LeetCode)
  • JDBC实现模糊、动态与分页查询的详解
  • 域环境信息收集技术详解:从基础命令到实战应用
  • nodejs特性解读
  • 【C++ Qt】布局管理器
  • vscode用python开发maya联动调试设置
  • SLAM定位常用地图对比示例
  • Ubnutu ADB 无法识别设备的解决方法
  • 前端-HTML元素
  • dagster的etl实现
  • python的漫画网站管理系统
  • 源码安装gperftools工具
  • QMK 宏(Macros)功能详解(实战部分)
  • 前端脚手架开发指南:提高开发效率的核心操作
  • 搜索引擎工作原理|倒排索引|query改写|CTR点击率预估|爬虫
  • Python实例题:Python自动工资条
  • Function Calling万字实战指南:打造高智能数据分析Agent平台
  • spark MySQL数据库配置