在阅读docker1.8的源代码时,我发现 reexec.Init()出现在docker.go
,dockerinit.go
和一些测试文件中。
如果reexec
已注册函数,则 reexec.Init()将返回true
,以便在docker.go
中进程将返回。
来自README.md
包的reexec
:
reexec
包促进了我们需要的docker二进制文件的busybox样式重新执行,因为 使用Go的分叉限制。
那么使用 reexec.Init()的目的是什么?
reexec.Init()的唯一目的是初始化docker容器的环境吗?
答案 0 :(得分:0)
正如您在commit 7321067中看到的那样,它在docker 1.2(2014年8月)中引入了reexec.Init()
:
这会通过不指定
-driver
来更改exec驱动程序的工作方式 reexec上的标志 对于每个exec驱动程序,它们都会注册自己的函数,这些函数将与exec上的argv 0匹配,并在它们匹配时调用。这也允许将任何功能添加到docker中,以便可以重新执行二进制文件,并且可以调用任何类型的函数。
我将docker exec上的标志解析移动到特定的初始值设定项,以便实现不会相互渗透 这也允许reexec初始值设定项中的更多灵活性,以指定自己的标志和选项。
Init
被称为exec进程的第一部分,如果调用初始化函数则返回true
如果调用初始值设定项,则docker会以静默方式退出而不是旧的错误消息 之前,它是:
log.Fatal("This is a client-only binary - running it as 'dockerinit' is not supported.")