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

将你的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/_/scratch
  • copy指令将.go文件编译出的hello文件复制到容器镜像的根目录中
  • 最后一条指令运行我们的hello文件
FROM scratch

COPY hello /

CMD ["/hello"]

构建镜像

通过以下命令构建镜像:

sudo docker image build -t hello:sleep .
  • 镜像名字为hello
  • tag为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
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值