Files
linuxkit/pkg/containerd/cmd/service/system_init.go
Ian Campbell b3db1a887c Update to containerd v1.0.0-alpha1
This is actually containerd#1141 rebased onto v1.0.0-alpha1.

The `dist` command has been integreated into `ctr` and so is removed, including
from the getty and sshd bind mounts and the test which uses it is updated..

There is no change to the version of runc vendored by containerd, so this is
unchanged.

Signed-off-by: Ian Campbell <ijc@docker.com>
2017-07-20 14:10:51 +01:00

103 lines
2.2 KiB
Go

package main
import (
"context"
"flag"
"fmt"
"os"
"path/filepath"
"syscall"
log "github.com/Sirupsen/logrus"
"github.com/containerd/containerd"
"github.com/containerd/containerd/errdefs"
"github.com/containerd/containerd/namespaces"
"github.com/pkg/errors"
)
func cleanupTask(ctx context.Context, ctr containerd.Container) error {
task, err := ctr.Task(ctx, nil)
if err != nil {
if errdefs.IsNotFound(err) {
return nil
}
return errors.Wrap(err, "getting task")
}
deleteErr := make(chan error, 1)
deleteCtx, deleteCancel := context.WithCancel(ctx)
defer deleteCancel()
go func(ctx context.Context, ch chan error) {
_, err := task.Delete(ctx)
if err != nil {
ch <- errors.Wrap(err, "killing task")
}
ch <- nil
}(deleteCtx, deleteErr)
sig := syscall.SIGKILL
if err := task.Kill(ctx, sig); err != nil && !errdefs.IsNotFound(err) {
return errors.Wrapf(err, "killing task with %q", sig)
}
select {
case err := <-deleteErr:
return err
case <-ctx.Done():
return ctx.Err()
}
}
func systemInit(args []string) {
invoked := filepath.Base(os.Args[0])
flags := flag.NewFlagSet("system-init", flag.ExitOnError)
flags.Usage = func() {
fmt.Printf("USAGE: %s system-init\n\n", invoked)
fmt.Printf("Options:\n")
flags.PrintDefaults()
}
sock := flags.String("sock", "/run/containerd/containerd.sock", "Path to containerd socket")
if err := flags.Parse(args); err != nil {
log.Fatal("Unable to parse args")
}
args = flags.Args()
if len(args) != 0 {
fmt.Println("Unexpected argument")
flags.Usage()
os.Exit(1)
}
client, err := containerd.New(*sock)
if err != nil {
log.WithError(err).Fatal("creating containerd client")
}
ctx := namespaces.WithNamespace(context.Background(), "default")
ctrs, err := client.Containers(ctx)
if err != nil {
log.WithError(err).Fatal("listing containers")
}
// None of the errors in this loop are fatal since we want to
// keep trying.
for _, ctr := range ctrs {
log.Infof("Cleaning up stale service: %q", ctr.ID())
log := log.WithFields(log.Fields{
"service": ctr.ID(),
})
if err := cleanupTask(ctx, ctr); err != nil {
log.WithError(err).Error("cleaning up task")
}
if err := ctr.Delete(ctx); err != nil {
log.WithError(err).Error("deleting container")
}
}
}