From b1fcb1745f71ea841cf362d9907968aad11f26ed Mon Sep 17 00:00:00 2001 From: Michael Crosby Date: Fri, 24 Mar 2017 14:03:26 -0700 Subject: [PATCH 1/4] Open stdin write side in shim Signed-off-by: Michael Crosby --- cmd/ctr/run.go | 2 ++ linux/shim/exec.go | 14 ++++++++++++++ linux/shim/init.go | 13 +++++++++++++ linux/shim/io.go | 3 +++ 4 files changed, 32 insertions(+) diff --git a/cmd/ctr/run.go b/cmd/ctr/run.go index ce2a959..49063c6 100644 --- a/cmd/ctr/run.go +++ b/cmd/ctr/run.go @@ -4,6 +4,7 @@ import ( gocontext "context" "encoding/json" "fmt" + "os" "path/filepath" "runtime" "strconv" @@ -254,6 +255,7 @@ var runCommand = cli.Command{ if err != nil { return err } + defer os.RemoveAll(tmpDir) events, err := containers.Events(ctx, &execution.EventsRequest{}) if err != nil { return err diff --git a/linux/shim/exec.go b/linux/shim/exec.go index 4b45273..5328a6e 100644 --- a/linux/shim/exec.go +++ b/linux/shim/exec.go @@ -4,14 +4,17 @@ import ( "context" "encoding/json" "fmt" + "io" "os" "path/filepath" "sync" + "syscall" "github.com/crosbymichael/console" runc "github.com/crosbymichael/go-runc" shimapi "github.com/docker/containerd/api/services/shim" specs "github.com/opencontainers/runtime-spec/specs-go" + "github.com/tonistiigi/fifo" ) type execProcess struct { @@ -22,6 +25,7 @@ type execProcess struct { io runc.IO status int pid int + closers []io.Closer parent *initProcess } @@ -66,6 +70,13 @@ func newExecProcess(context context.Context, path string, r *shimapi.ExecRequest if err := parent.runc.Exec(context, parent.id, spec, opts); err != nil { return nil, err } + if r.Stdin != "" { + sc, err := fifo.OpenFifo(context, r.Stdin, syscall.O_WRONLY|syscall.O_NONBLOCK, 0) + if err != nil { + return nil, err + } + e.closers = append(e.closers, sc) + } if socket != nil { console, err := socket.ReceiveMaster() if err != nil { @@ -111,6 +122,9 @@ func (e *execProcess) Exited(status int) { e.status = status e.Wait() if e.io != nil { + for _, c := range e.closers { + c.Close() + } e.io.Close() } } diff --git a/linux/shim/init.go b/linux/shim/init.go index aba5c60..d11669b 100644 --- a/linux/shim/init.go +++ b/linux/shim/init.go @@ -2,6 +2,7 @@ package shim import ( "context" + "io" "os" "path/filepath" "sync" @@ -11,6 +12,7 @@ import ( runc "github.com/crosbymichael/go-runc" "github.com/docker/containerd" shimapi "github.com/docker/containerd/api/services/shim" + "github.com/tonistiigi/fifo" ) type initProcess struct { @@ -23,6 +25,7 @@ type initProcess struct { runc *runc.Runc status int pid int + closers []io.Closer } func newInitProcess(context context.Context, path string, r *shimapi.CreateRequest) (*initProcess, error) { @@ -73,6 +76,13 @@ func newInitProcess(context context.Context, path string, r *shimapi.CreateReque if err := p.runc.Create(context, r.ID, r.Bundle, opts); err != nil { return nil, err } + if r.Stdin != "" { + sc, err := fifo.OpenFifo(context, r.Stdin, syscall.O_WRONLY|syscall.O_NONBLOCK, 0) + if err != nil { + return nil, err + } + p.closers = append(p.closers, sc) + } if socket != nil { console, err := socket.ReceiveMaster() if err != nil { @@ -125,6 +135,9 @@ func (p *initProcess) Delete(context context.Context) error { p.Wait() err := p.runc.Delete(context, p.id) if p.io != nil { + for _, c := range p.closers { + c.Close() + } p.io.Close() } return err diff --git a/linux/shim/io.go b/linux/shim/io.go index 8fbd647..8387c04 100644 --- a/linux/shim/io.go +++ b/linux/shim/io.go @@ -68,6 +68,9 @@ func copyPipes(ctx context.Context, rio runc.IO, stdin, stdout, stderr string, w } dest(fw, fr) } + if stdin == "" { + return nil + } f, err := fifo.OpenFifo(ctx, stdin, syscall.O_RDONLY, 0) if err != nil { return fmt.Errorf("containerd-shim: opening %s failed: %s", stdin, err) From 71870d7631f67526aee48b26bb7a960aa18cbfb6 Mon Sep 17 00:00:00 2001 From: Akihiro Suda Date: Thu, 30 Mar 2017 09:26:33 +0000 Subject: [PATCH 2/4] ctr/run: revive specifying custom command e.g. $ ctr run --id foo docker.io/library/busybox:latest ls Signed-off-by: Akihiro Suda --- cmd/ctr/run.go | 12 +++++++++--- 1 file changed, 9 insertions(+), 3 deletions(-) diff --git a/cmd/ctr/run.go b/cmd/ctr/run.go index ce2a959..e72957f 100644 --- a/cmd/ctr/run.go +++ b/cmd/ctr/run.go @@ -51,8 +51,13 @@ func spec(id string, config *ocispec.ImageConfig, context *cli.Context) (*specs. "PATH=/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin", } env = append(env, config.Env...) + cmd := config.Cmd + if v := context.Args().Tail(); len(v) > 0 { + cmd = v + } var ( - args = append(config.Entrypoint, config.Cmd...) + // TODO: support overriding entrypoint + args = append(config.Entrypoint, cmd...) tty = context.Bool("tty") uid, gid uint32 ) @@ -214,8 +219,9 @@ func spec(id string, config *ocispec.ImageConfig, context *cli.Context) (*specs. } var runCommand = cli.Command{ - Name: "run", - Usage: "run a container", + Name: "run", + Usage: "run a container", + ArgsUsage: "IMAGE [COMMAND] [ARG...]", Flags: []cli.Flag{ cli.StringFlag{ Name: "id", From cc983be17a9ed00dfb4296767c9e16dee7f19181 Mon Sep 17 00:00:00 2001 From: Stephen J Day Date: Thu, 30 Mar 2017 17:20:16 -0700 Subject: [PATCH 3/4] cmd/dist, images: allow image delete This adds very simple deletion of images by name. We still need to consider the approach to handling image name, so this may change. For the time being, it allows one to delete an image entry in the metadata database. Signed-off-by: Stephen J Day --- cmd/dist/images.go | 38 ++++++++++++++++++++++++++++++++++++++ cmd/dist/main.go | 1 + cmd/dist/pull.go | 1 + images/storage.go | 6 ++++++ 4 files changed, 46 insertions(+) diff --git a/cmd/dist/images.go b/cmd/dist/images.go index be5a83d..fbc1e76 100644 --- a/cmd/dist/images.go +++ b/cmd/dist/images.go @@ -61,3 +61,41 @@ var imagesCommand = cli.Command{ return nil }, } + +var rmiCommand = cli.Command{ + Name: "rmi", + Usage: "Delete one or more images by reference.", + ArgsUsage: "[flags] [, ...]", + Description: `Delete one or more images by reference.`, + Flags: []cli.Flag{}, + Action: func(clicontext *cli.Context) error { + var ( + ctx = background + exitErr error + ) + + db, err := getDB(clicontext, false) + if err != nil { + return errors.Wrap(err, "failed to open database") + } + + tx, err := db.Begin(true) + if err != nil { + return errors.Wrap(err, "could not start transaction") + } + defer tx.Rollback() + + for _, target := range clicontext.Args() { + if err := images.Delete(tx, target); err != nil { + if exitErr == nil { + exitErr = errors.Wrapf(err, "unable to delete %v", target) + } + log.G(ctx).WithError(err).Errorf("unable to delete %v", target) + } + + fmt.Println(target) + } + + return exitErr + }, +} diff --git a/cmd/dist/main.go b/cmd/dist/main.go index d0070cf..c3fc54e 100644 --- a/cmd/dist/main.go +++ b/cmd/dist/main.go @@ -62,6 +62,7 @@ distribution tool } app.Commands = []cli.Command{ imagesCommand, + rmiCommand, pullCommand, fetchCommand, fetchObjectCommand, diff --git a/cmd/dist/pull.go b/cmd/dist/pull.go index 1c93f25..82423f8 100644 --- a/cmd/dist/pull.go +++ b/cmd/dist/pull.go @@ -67,6 +67,7 @@ command. As part of this process, we do the following: ingester := contentservice.NewIngesterFromClient(contentapi.NewContentClient(conn)) provider := contentservice.NewProviderFromClient(contentapi.NewContentClient(conn)) + cs, err := resolveContentStore(clicontext) if err != nil { return err diff --git a/images/storage.go b/images/storage.go index 2f4382a..050addb 100644 --- a/images/storage.go +++ b/images/storage.go @@ -103,6 +103,12 @@ func List(tx *bolt.Tx) ([]Image, error) { return images, nil } +func Delete(tx *bolt.Tx, name string) error { + return withImagesBucket(tx, func(bkt *bolt.Bucket) error { + return bkt.DeleteBucket([]byte(name)) + }) +} + func readImage(image *Image, bkt *bolt.Bucket) error { return bkt.ForEach(func(k, v []byte) error { if v == nil { From 803a60eaac561193c599a30a32d544780b557b89 Mon Sep 17 00:00:00 2001 From: Random-Liu Date: Fri, 31 Mar 2017 17:08:08 -0700 Subject: [PATCH 4/4] Propose discussion of image filesystem metrics. Signed-off-by: Lantao Liu --- docs/dockercon-summit.md | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/docs/dockercon-summit.md b/docs/dockercon-summit.md index eb115d4..84eff04 100644 --- a/docs/dockercon-summit.md +++ b/docs/dockercon-summit.md @@ -17,4 +17,5 @@ If you have not signed up to attend the summit you can do so in this [form](http The following are proposed discussion points for the containerd summit at Dockercon US 2017: -* Since containerd is one of the bottom bricks in the stack, how can we setup automated integration tests for consumers of containerd? +* Since containerd is one of the bottom bricks in the stack, how can we setup automated integration tests for consumers of containerd? +* Should containerd provide image filesystem metrics? If yes, what metrics should be included? How to implement that?