使用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
标签:src,sudo,编译,go,Go,镜像,Docker,docker,打包
From: https://www.cnblogs.com/N3ptune/p/16656994.html