diff --git a/cmd/containerd/config.go b/cmd/containerd/config.go index 65e4018..82187f7 100644 --- a/cmd/containerd/config.go +++ b/cmd/containerd/config.go @@ -1,6 +1,11 @@ package main -import "github.com/BurntSushi/toml" +import ( + "bytes" + "io" + + "github.com/BurntSushi/toml" +) func defaultConfig() *config { return &config{ @@ -58,6 +63,15 @@ func (c *config) decodePlugin(name string, v interface{}) error { return c.md.PrimitiveDecode(p, v) } +func (c *config) WriteTo(w io.Writer) (int64, error) { + buf := bytes.NewBuffer(nil) + e := toml.NewEncoder(buf) + if err := e.Encode(c); err != nil { + return 0, err + } + return io.Copy(w, buf) +} + type grpcConfig struct { Socket string `toml:"socket"` Uid int `toml:"uid"` diff --git a/cmd/containerd/main.go b/cmd/containerd/main.go index fa0bffd..f9b5f5c 100644 --- a/cmd/containerd/main.go +++ b/cmd/containerd/main.go @@ -3,6 +3,7 @@ package main import ( _ "expvar" "fmt" + "io/ioutil" "net/http" _ "net/http/pprof" "os" @@ -60,7 +61,7 @@ func main() { app.Flags = []cli.Flag{ cli.StringFlag{ Name: "config,c", - Usage: "path to the configuration file", + Usage: "path to the configuration file (Use 'default' to output the default toml)", Value: "/etc/containerd/config.toml", }, cli.StringFlag{ @@ -148,6 +149,19 @@ func main() { } func before(context *cli.Context) error { + if context.GlobalString("config") == "default" { + fh, err := ioutil.TempFile("", "containerd-config.toml.") + if err != nil { + return err + } + if _, err := conf.WriteTo(fh); err != nil { + fh.Close() + return err + } + fh.Close() + log.G(global).Infof("containerd default config written to %q", fh.Name()) + os.Exit(0) + } if err := loadConfig(context.GlobalString("config")); err != nil && !os.IsNotExist(err) { return err