【containerd 1.0 源码分析】containerd-shime 启动流程分析
2017-08-04 14:39
591 查看
命令:
shim for container lifecycle and reconnection
USAGE:
containerd-shim [global options] command [command options] [arguments...]
VERSION:
v1.0.0-alpha3.m
COMMANDS:
help, h Shows a list of commands or help for one command
GLOBAL OPTIONS:
--debug enable debug output in logs
--namespace value, -n value namespace that owns the task
--socket value, -s value abstract socket path to serve on
--address value, -a value grpc address back to containerd
--help, -h show help
--version, -v print the version
cmd/containerd/main.go 中 main 函数,NewApp 使用了第三方一个命令行设置,设置名字,以及命令行启动参数,子命令等
1.2 app.Action
主要是建立 GRPC 服务,以及创建 shim 服务
1.3 NewService 如下
1.4 serve 如果没有指定 --socket 则从父继承过来
shim for container lifecycle and reconnection
USAGE:
containerd-shim [global options] command [command options] [arguments...]
VERSION:
v1.0.0-alpha3.m
COMMANDS:
help, h Shows a list of commands or help for one command
GLOBAL OPTIONS:
--debug enable debug output in logs
--namespace value, -n value namespace that owns the task
--socket value, -s value abstract socket path to serve on
--address value, -a value grpc address back to containerd
--help, -h show help
--version, -v print the version
一. containerd-shim main 函数
1.1 入口目录为cmd/containerd/main.go 中 main 函数,NewApp 使用了第三方一个命令行设置,设置名字,以及命令行启动参数,子命令等
app := cli.NewApp() app.Name = "containerd-shim" app.Version = version.Version app.Usage = usage app.Flags = []cli.Flag{ cli.BoolFlag{ Name: "debug", Usage: "enable debug output in logs", }, cli.StringFlag{ Name: "namespace,n", Usage: "namespace that owns the task", }, cli.StringFlag{ Name: "socket,s", Usage: "abstract socket path to serve on", }, cli.StringFlag{ Name: "address,a", Usage: "grpc address back to containerd", }, } app.Before = func(context *cli.Context) error { if context.GlobalBool("debug") { logrus.SetLevel(logrus.DebugLevel) } return nil }
1.2 app.Action
主要是建立 GRPC 服务,以及创建 shim 服务
app.Action = func(context *cli.Context) error { // start handling signals as soon as possible so that things are properly reaped // or if runtime exits before we hit the handler signals, err := setupSignals() if err != nil { return err } path, err := os.Getwd() if err != nil { return err } server := grpc.NewServer() e, err := connectEvents(context.GlobalString("address")) if err != nil { return err } sv, err := shim.NewService( path, context.GlobalString("namespace"), &remoteEventsPublisher{client: e}, ) if err != nil { return err } logrus.Debug("registering grpc server") shimapi.RegisterShimServer(server, sv) socket := context.GlobalString("socket") if err := serve(server, socket); err != nil { return err } return handleSignals(signals, server) }
1.3 NewService 如下
// NewService returns a new shim service that can be used via GRPC func NewService(path, namespace string, publisher events.Publisher) (*Service, error) { if namespace == "" { return nil, fmt.Errorf("shim namespace cannot be empty") } context := namespaces.WithNamespace(context.Background(), namespace) s := &Service{ path: path, processes: make(map[string]process), events: make(chan interface{}, 4096), namespace: namespace, context: context, } if err := s.initPlatform(); err != nil { return nil, errors.Wrap(err, "failed to initialized platform behavior") } go s.forward(publisher) return s, nil }
1.4 serve 如果没有指定 --socket 则从父继承过来
// serve serves the grpc API over a unix socket at the provided path // this function does not block func serve(server *grpc.Server, path string) error { var ( l net.Listener err error ) if path == "" { l, err = net.FileListener(os.NewFile(3, "socket")) path = "[inherited from parent]" } else { l, err = net.Listen("unix", "\x00"+path) } if err != nil { return err } logrus.WithField("socket", path).Debug("serving api on unix socket") go func() { defer l.Close() if err := server.Serve(l); err != nil && !strings.Contains(err.Error(), "use of closed network connection") { logrus.WithError(err).Fatal("containerd-shim: GRPC server failure") } }() return nil }
相关文章推荐
- 【containerd 1.0 源码分析】containerd 启动流程分析
- [Android]Android系统启动流程源码分析
- HDFS2.X源码分析之:NameNode启动流程分析
- [android源码分析]bluetoothd service的启动的总体流程分析
- Android进阶系列之源码分析Activity的启动流程
- Journey源码分析二:整体启动流程
- Android系统启动流程源码分析
- React Native启动流程集合安卓源码分析
- MyCat源码分析系列之——配置信息和启动流程
- Android中ICS4.0源码Launcher启动流程分析【android源码Launcher系列一】
- [Android]Android系统启动流程源码分析
- Nginx源码分析 - 主流程篇 - Nginx的启动流程
- UCOSII启动流程详解(结合源码分析)
- 源码角度分析Android启动流程
- JobTracker启动流程源码级分析
- spring源码之旅(2)_applicationcontext启动流程分析
- [置顶] Activity启动流程源码分析(应用中)
- YARN源码分析之ApplicationMaster启动流程之RM端
- Android Activty的加载过程 启动流程 源码分析
- Java NIO框架Netty教程(四) – ServerBootStrap启动流程源码分析