Docker Go语言程序的编译与打包
使用Docker打包Go程序的镜像
Golang镜像
首先使用docker pull获取golang镜像
$ sudo docker pull golang:1.18.3
查看镜像:
$ sudo docker image ls golang alpine d0f5238dcb8b 3 weeks ago 352MB
在docker中运行go指令,查看go版本
$ sudo docker run -it --rm d0f go version go version go1.19 linux/amd64
进入该镜像,查看目录结构:
$ sudo docker run -it --rm d0f sh /go # ls -l total 8 drwxrwxrwx 2 root root 4096 Aug 9 19:12 bin drwxrwxrwx 2 root root 4096 Aug 9 19:12 src /go # cd / / # ls bin etc home media opt root sbin sys usr dev go lib mnt proc run srv tmp var
打包Go程序
先简单的打包一个go语言程序,使用docker将其打包
代码如下:
package main import "fmt" func main() { fmt.Println("Hello World") }
编写对应Dokerfile:
FROM golang:1.8.3 WORKDIR /go/src ADD . /go/src RUN cd /go/src && go build -o main CMD ["/go/src/main"]
使用FROM命令,表明将基于golang来构建镜像,WORKDIR设置工作目录,将当前项目的根目录拷贝到src目录,之后RUN编译源代码,最后CMD执行程序
单纯构建
先实行简单构建,如下所示,将这个镜像命名为docker-go,版本号为1.0
$ sudo docker image build -t docker-go:v1 .
打包完毕后,使用docker run运行:
$ sudo docker run -it --rm docker-go:v1 Hello World
该镜像的大小高达700MB,显然可以更小的打包
分阶段构建
使用分阶段构建,谋求更小体积的镜像
在上述构建过程中,可以分为编译阶段和打包阶段
对于编译阶段后,在编译源代码结束后,源代码和环境都不需要
对于打包阶段,基于一个apline镜像,将编译好的镜像复制到apline镜像上
改写Dockerfile:
FROM golang:1.8.3 As buildStage WORKDIR /go/src ADD . /go/src RUN cd /go/src && go build -o main FROM alpine:latest WORKDIR /app COPY --from=buildStage /go/src/main /app/ ENTRYPOINT ./main
使用WORKDIR命令设置工作目录,接着使用COPY命令将编译好的程序复制到新的路径下,使用ENTRYPOINT设置一个入口点
$ sudo docker image build -t docker-go:v2 .
执行该命令进行打包,再次查看镜像大小:
$ sudo docker image ls docker-go v2 a6b029a1d5d7 39 seconds ago 7.08MB
这次只有7MB多,并且成功运行:
$ sudo docker run -it --rm docker-go:v2 Hello World
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 震惊!C++程序真的从main开始吗?99%的程序员都答错了
· winform 绘制太阳,地球,月球 运作规律
· 【硬核科普】Trae如何「偷看」你的代码?零基础破解AI编程运行原理
· 超详细:普通电脑也行Windows部署deepseek R1训练数据并当服务器共享给他人
· 上周热点回顾(3.3-3.9)