如何通过引入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
字符
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)