构建最小化的 go 语言 docker 容器

构建最小化的 go 语言 docker 容器,第1张

将你的go语言代码容器化

如何通过引入Scratch,创建一个尽可能小的、go语言代码写的Docker容器?

官方的docker仓库有个项目:https://github.com/docker-library/hello-world,可以在shell终端打印出hello world

本文只需三行Dockerfile+一个简单的.go文件即可完成功能

编写go语言代码

下面是一个简单的go语言程序源码,它每两秒打印出wdnmd字符

package main

import "fmt"
import "time"

func main(){
	for {
	fmt.Println("wdnmd")
	time.Sleep(time.Duration(2)*time.Second)
	}
}
编译出静态链接的二进制文件

go语言默认是动态链接的,比如你使用 go build指令,那么会得到一个动态链接文件,为了得到静态 链接的二进制文件,需要使用以下编译命令:

CGO_ENABLED=0 go build -a -ldflags '-s' 1.go 

为了验证编译出的文件是否是静态链接的,可以使用ldd命令检查:

$ ldd hello
        not a dynamic executable

这说明是一个静态链接文件

下面是动态链接的结果,由于是动态链接,因此缺少共享库

$ ldd container_hello 
        linux-vdso.so.1 (0x00007ffe3d7bc000)
        libpthread.so.0 => /lib/x86_64-linux-gnu/libpthread.so.0 (0x00007fe94a709000)
        libc.so.6 => /lib/x86_64-linux-gnu/libc.so.6 (0x00007fe94a318000)
        /lib64/ld-linux-x86-64.so.2 (0x00007fe94a928000)
编写Dockerfile 空镜像scratch是用来构建超小容器镜像的不二之选,并且它不会在镜像中创建额外的层,详见https://hub.docker.com/_/scratchcopy指令将.go文件编译出的hello文件复制到容器镜像的根目录中最后一条指令运行我们的hello文件
FROM scratch

COPY hello /

CMD ["/hello"]
构建镜像

通过以下命令构建镜像:

sudo docker image build -t hello:sleep .
镜像名字为hellotag为sleep

查看镜像是否构建成功:

sudo docker image ls
[sudo] password for zaralts:
REPOSITORY    TAG       IMAGE ID       CREATED        SIZE
hello         sleep     503f2930b6fe   3 hours ago    1.76MB
运行容器实例
sudo docker container run hello:sleep
结束

至此,我们通过go语言的二进制文件,创建了一个最小化的docker容器,它每两秒在终端打印出wdnmd字符

欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/langs/990618.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2022-05-21
下一篇 2022-05-21

发表评论

登录后才能评论

评论列表(0条)

保存