Merge pull request #564 from Random-Liu/update-containerd
Update containerd to 4812f4be8f
.
This commit is contained in:
commit
31845714ef
1
cri.go
1
cri.go
@ -30,7 +30,6 @@ import (
|
|||||||
// TODO(random-liu): Use github.com/pkg/errors for our errors.
|
// TODO(random-liu): Use github.com/pkg/errors for our errors.
|
||||||
// Register CRI service plugin
|
// Register CRI service plugin
|
||||||
func init() {
|
func init() {
|
||||||
// TODO(random-liu): Make `containerd config default` print plugin default config.
|
|
||||||
config := options.DefaultConfig().PluginConfig
|
config := options.DefaultConfig().PluginConfig
|
||||||
plugin.Register(&plugin.Registration{
|
plugin.Register(&plugin.Registration{
|
||||||
// In fact, cri is not strictly a GRPC plugin now.
|
// In fact, cri is not strictly a GRPC plugin now.
|
||||||
|
@ -1,6 +1,6 @@
|
|||||||
RUNC_VERSION=7f24b40cc5423969b4554ef04ba0b00e2b4ba010
|
RUNC_VERSION=7f24b40cc5423969b4554ef04ba0b00e2b4ba010
|
||||||
CNI_VERSION=v0.6.0
|
CNI_VERSION=v0.6.0
|
||||||
CONTAINERD_VERSION=90553efdef0678b2609aed74926a487f8ff58d1a
|
CONTAINERD_VERSION=4812f4be8ffa2b9558915a93cce5901004d27cb8
|
||||||
CONTAINERD_REPO=
|
CONTAINERD_REPO=
|
||||||
CRITOOL_VERSION=v1.0.0-alpha.0
|
CRITOOL_VERSION=v1.0.0-alpha.0
|
||||||
KUBERNETES_VERSION=v1.9.0
|
KUBERNETES_VERSION=v1.9.0
|
||||||
|
@ -1,7 +1,7 @@
|
|||||||
github.com/blang/semver v3.1.0
|
github.com/blang/semver v3.1.0
|
||||||
github.com/BurntSushi/toml v0.2.0-21-g9906417
|
github.com/BurntSushi/toml v0.2.0-21-g9906417
|
||||||
github.com/containerd/cgroups 29da22c6171a4316169f9205ab6c49f59b5b852f
|
github.com/containerd/cgroups 29da22c6171a4316169f9205ab6c49f59b5b852f
|
||||||
github.com/containerd/containerd 90553efdef0678b2609aed74926a487f8ff58d1a
|
github.com/containerd/containerd 4812f4be8ffa2b9558915a93cce5901004d27cb8
|
||||||
github.com/containerd/continuity cf279e6ac893682272b4479d4c67fd3abf878b4e
|
github.com/containerd/continuity cf279e6ac893682272b4479d4c67fd3abf878b4e
|
||||||
github.com/containerd/fifo fbfb6a11ec671efbe94ad1c12c2e98773f19e1e6
|
github.com/containerd/fifo fbfb6a11ec671efbe94ad1c12c2e98773f19e1e6
|
||||||
github.com/containerd/typeurl f6943554a7e7e88b3c14aad190bf05932da84788
|
github.com/containerd/typeurl f6943554a7e7e88b3c14aad190bf05932da84788
|
||||||
|
6
vendor/github.com/containerd/containerd/client.go
generated
vendored
6
vendor/github.com/containerd/containerd/client.go
generated
vendored
@ -222,11 +222,11 @@ func (c *Client) Pull(ctx context.Context, ref string, opts ...RemoteOpt) (Image
|
|||||||
|
|
||||||
name, desc, err := pullCtx.Resolver.Resolve(ctx, ref)
|
name, desc, err := pullCtx.Resolver.Resolve(ctx, ref)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return nil, err
|
return nil, errors.Wrapf(err, "failed to resolve reference %q", ref)
|
||||||
}
|
}
|
||||||
fetcher, err := pullCtx.Resolver.Fetcher(ctx, name)
|
fetcher, err := pullCtx.Resolver.Fetcher(ctx, name)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return nil, err
|
return nil, errors.Wrapf(err, "failed to get fetcher for %q", name)
|
||||||
}
|
}
|
||||||
|
|
||||||
var (
|
var (
|
||||||
@ -281,7 +281,7 @@ func (c *Client) Pull(ctx context.Context, ref string, opts ...RemoteOpt) (Image
|
|||||||
}
|
}
|
||||||
if pullCtx.Unpack {
|
if pullCtx.Unpack {
|
||||||
if err := img.Unpack(ctx, pullCtx.Snapshotter); err != nil {
|
if err := img.Unpack(ctx, pullCtx.Snapshotter); err != nil {
|
||||||
return nil, err
|
errors.Wrapf(err, "failed to unpack image on snapshotter %s", pullCtx.Snapshotter)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
return img, nil
|
return img, nil
|
||||||
|
2
vendor/github.com/containerd/containerd/dialer/dialer.go
generated
vendored
2
vendor/github.com/containerd/containerd/dialer/dialer.go
generated
vendored
@ -42,7 +42,7 @@ func Dialer(address string, timeout time.Duration) (net.Conn, error) {
|
|||||||
close(stopC)
|
close(stopC)
|
||||||
go func() {
|
go func() {
|
||||||
dr := <-synC
|
dr := <-synC
|
||||||
if dr != nil {
|
if dr != nil && dr.c != nil {
|
||||||
dr.c.Close()
|
dr.c.Close()
|
||||||
}
|
}
|
||||||
}()
|
}()
|
||||||
|
13
vendor/github.com/containerd/containerd/fs/copy_linux.go
generated
vendored
13
vendor/github.com/containerd/containerd/fs/copy_linux.go
generated
vendored
@ -14,8 +14,21 @@ import (
|
|||||||
func copyFileInfo(fi os.FileInfo, name string) error {
|
func copyFileInfo(fi os.FileInfo, name string) error {
|
||||||
st := fi.Sys().(*syscall.Stat_t)
|
st := fi.Sys().(*syscall.Stat_t)
|
||||||
if err := os.Lchown(name, int(st.Uid), int(st.Gid)); err != nil {
|
if err := os.Lchown(name, int(st.Uid), int(st.Gid)); err != nil {
|
||||||
|
if os.IsPermission(err) {
|
||||||
|
// Normally if uid/gid are the same this would be a no-op, but some
|
||||||
|
// filesystems may still return EPERM... for instance NFS does this.
|
||||||
|
// In such a case, this is not an error.
|
||||||
|
if dstStat, err2 := os.Lstat(name); err2 == nil {
|
||||||
|
st2 := dstStat.Sys().(*syscall.Stat_t)
|
||||||
|
if st.Uid == st2.Uid && st.Gid == st2.Gid {
|
||||||
|
err = nil
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
if err != nil {
|
||||||
return errors.Wrapf(err, "failed to chown %s", name)
|
return errors.Wrapf(err, "failed to chown %s", name)
|
||||||
}
|
}
|
||||||
|
}
|
||||||
|
|
||||||
if (fi.Mode() & os.ModeSymlink) != os.ModeSymlink {
|
if (fi.Mode() & os.ModeSymlink) != os.ModeSymlink {
|
||||||
if err := os.Chmod(name, fi.Mode()); err != nil {
|
if err := os.Chmod(name, fi.Mode()); err != nil {
|
||||||
|
13
vendor/github.com/containerd/containerd/fs/copy_unix.go
generated
vendored
13
vendor/github.com/containerd/containerd/fs/copy_unix.go
generated
vendored
@ -16,8 +16,21 @@ import (
|
|||||||
func copyFileInfo(fi os.FileInfo, name string) error {
|
func copyFileInfo(fi os.FileInfo, name string) error {
|
||||||
st := fi.Sys().(*syscall.Stat_t)
|
st := fi.Sys().(*syscall.Stat_t)
|
||||||
if err := os.Lchown(name, int(st.Uid), int(st.Gid)); err != nil {
|
if err := os.Lchown(name, int(st.Uid), int(st.Gid)); err != nil {
|
||||||
|
if os.IsPermission(err) {
|
||||||
|
// Normally if uid/gid are the same this would be a no-op, but some
|
||||||
|
// filesystems may still return EPERM... for instance NFS does this.
|
||||||
|
// In such a case, this is not an error.
|
||||||
|
if dstStat, err2 := os.Lstat(name); err2 == nil {
|
||||||
|
st2 := dstStat.Sys().(*syscall.Stat_t)
|
||||||
|
if st.Uid == st2.Uid && st.Gid == st2.Gid {
|
||||||
|
err = nil
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
if err != nil {
|
||||||
return errors.Wrapf(err, "failed to chown %s", name)
|
return errors.Wrapf(err, "failed to chown %s", name)
|
||||||
}
|
}
|
||||||
|
}
|
||||||
|
|
||||||
if (fi.Mode() & os.ModeSymlink) != os.ModeSymlink {
|
if (fi.Mode() & os.ModeSymlink) != os.ModeSymlink {
|
||||||
if err := os.Chmod(name, fi.Mode()); err != nil {
|
if err := os.Chmod(name, fi.Mode()); err != nil {
|
||||||
|
41
vendor/github.com/containerd/containerd/log/context.go
generated
vendored
41
vendor/github.com/containerd/containerd/log/context.go
generated
vendored
@ -2,7 +2,6 @@ package log
|
|||||||
|
|
||||||
import (
|
import (
|
||||||
"context"
|
"context"
|
||||||
"path"
|
|
||||||
|
|
||||||
"github.com/sirupsen/logrus"
|
"github.com/sirupsen/logrus"
|
||||||
)
|
)
|
||||||
@ -20,7 +19,6 @@ var (
|
|||||||
|
|
||||||
type (
|
type (
|
||||||
loggerKey struct{}
|
loggerKey struct{}
|
||||||
moduleKey struct{}
|
|
||||||
)
|
)
|
||||||
|
|
||||||
// WithLogger returns a new context with the provided logger. Use in
|
// WithLogger returns a new context with the provided logger. Use in
|
||||||
@ -40,42 +38,3 @@ func GetLogger(ctx context.Context) *logrus.Entry {
|
|||||||
|
|
||||||
return logger.(*logrus.Entry)
|
return logger.(*logrus.Entry)
|
||||||
}
|
}
|
||||||
|
|
||||||
// WithModule adds the module to the context, appending it with a slash if a
|
|
||||||
// module already exists. A module is just an roughly correlated defined by the
|
|
||||||
// call tree for a given context.
|
|
||||||
//
|
|
||||||
// As an example, we might have a "node" module already part of a context. If
|
|
||||||
// this function is called with "tls", the new value of module will be
|
|
||||||
// "node/tls".
|
|
||||||
//
|
|
||||||
// Modules represent the call path. If the new module and last module are the
|
|
||||||
// same, a new module entry will not be created. If the new module and old
|
|
||||||
// older module are the same but separated by other modules, the cycle will be
|
|
||||||
// represented by the module path.
|
|
||||||
func WithModule(ctx context.Context, module string) context.Context {
|
|
||||||
parent := GetModulePath(ctx)
|
|
||||||
|
|
||||||
if parent != "" {
|
|
||||||
// don't re-append module when module is the same.
|
|
||||||
if path.Base(parent) == module {
|
|
||||||
return ctx
|
|
||||||
}
|
|
||||||
|
|
||||||
module = path.Join(parent, module)
|
|
||||||
}
|
|
||||||
|
|
||||||
ctx = WithLogger(ctx, GetLogger(ctx).WithField("module", module))
|
|
||||||
return context.WithValue(ctx, moduleKey{}, module)
|
|
||||||
}
|
|
||||||
|
|
||||||
// GetModulePath returns the module path for the provided context. If no module
|
|
||||||
// is set, an empty string is returned.
|
|
||||||
func GetModulePath(ctx context.Context) string {
|
|
||||||
module := ctx.Value(moduleKey{})
|
|
||||||
if module == nil {
|
|
||||||
return ""
|
|
||||||
}
|
|
||||||
|
|
||||||
return module.(string)
|
|
||||||
}
|
|
||||||
|
122
vendor/github.com/containerd/containerd/oci/spec_opts_unix.go
generated
vendored
122
vendor/github.com/containerd/containerd/oci/spec_opts_unix.go
generated
vendored
@ -95,22 +95,25 @@ func WithImageConfig(image Image) SpecOpts {
|
|||||||
s.Process.Env = append(s.Process.Env, config.Env...)
|
s.Process.Env = append(s.Process.Env, config.Env...)
|
||||||
cmd := config.Cmd
|
cmd := config.Cmd
|
||||||
s.Process.Args = append(config.Entrypoint, cmd...)
|
s.Process.Args = append(config.Entrypoint, cmd...)
|
||||||
|
cwd := config.WorkingDir
|
||||||
|
if cwd == "" {
|
||||||
|
cwd = "/"
|
||||||
|
}
|
||||||
|
s.Process.Cwd = cwd
|
||||||
if config.User != "" {
|
if config.User != "" {
|
||||||
|
// According to OCI Image Spec v1.0.0, the following are valid for Linux:
|
||||||
|
// user, uid, user:group, uid:gid, uid:group, user:gid
|
||||||
parts := strings.Split(config.User, ":")
|
parts := strings.Split(config.User, ":")
|
||||||
switch len(parts) {
|
switch len(parts) {
|
||||||
case 1:
|
case 1:
|
||||||
v, err := strconv.Atoi(parts[0])
|
v, err := strconv.Atoi(parts[0])
|
||||||
if err != nil {
|
if err != nil {
|
||||||
// if we cannot parse as a uint they try to see if it is a username
|
// if we cannot parse as a uint they try to see if it is a username
|
||||||
if err := WithUsername(config.User)(ctx, client, c, s); err != nil {
|
return WithUsername(config.User)(ctx, client, c, s)
|
||||||
return err
|
|
||||||
}
|
|
||||||
return err
|
|
||||||
}
|
|
||||||
if err := WithUserID(uint32(v))(ctx, client, c, s); err != nil {
|
|
||||||
return err
|
|
||||||
}
|
}
|
||||||
|
return WithUserID(uint32(v))(ctx, client, c, s)
|
||||||
case 2:
|
case 2:
|
||||||
|
// TODO: support username and groupname
|
||||||
v, err := strconv.Atoi(parts[0])
|
v, err := strconv.Atoi(parts[0])
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return errors.Wrapf(err, "parse uid %s", parts[0])
|
return errors.Wrapf(err, "parse uid %s", parts[0])
|
||||||
@ -125,11 +128,6 @@ func WithImageConfig(image Image) SpecOpts {
|
|||||||
return fmt.Errorf("invalid USER value %s", config.User)
|
return fmt.Errorf("invalid USER value %s", config.User)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
cwd := config.WorkingDir
|
|
||||||
if cwd == "" {
|
|
||||||
cwd = "/"
|
|
||||||
}
|
|
||||||
s.Process.Cwd = cwd
|
|
||||||
return nil
|
return nil
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@ -259,6 +257,24 @@ func WithUIDGID(uid, gid uint32) SpecOpts {
|
|||||||
// uid, and not returns error.
|
// uid, and not returns error.
|
||||||
func WithUserID(uid uint32) SpecOpts {
|
func WithUserID(uid uint32) SpecOpts {
|
||||||
return func(ctx context.Context, client Client, c *containers.Container, s *specs.Spec) (err error) {
|
return func(ctx context.Context, client Client, c *containers.Container, s *specs.Spec) (err error) {
|
||||||
|
if c.Snapshotter == "" && c.SnapshotKey == "" {
|
||||||
|
if !isRootfsAbs(s.Root.Path) {
|
||||||
|
return errors.Errorf("rootfs absolute path is required")
|
||||||
|
}
|
||||||
|
uuid, ugid, err := getUIDGIDFromPath(s.Root.Path, func(u user.User) bool {
|
||||||
|
return u.Uid == int(uid)
|
||||||
|
})
|
||||||
|
if err != nil {
|
||||||
|
if os.IsNotExist(err) || err == errNoUsersFound {
|
||||||
|
s.Process.User.UID, s.Process.User.GID = uid, uid
|
||||||
|
return nil
|
||||||
|
}
|
||||||
|
return err
|
||||||
|
}
|
||||||
|
s.Process.User.UID, s.Process.User.GID = uuid, ugid
|
||||||
|
return nil
|
||||||
|
|
||||||
|
}
|
||||||
if c.Snapshotter == "" {
|
if c.Snapshotter == "" {
|
||||||
return errors.Errorf("no snapshotter set for container")
|
return errors.Errorf("no snapshotter set for container")
|
||||||
}
|
}
|
||||||
@ -270,33 +286,18 @@ func WithUserID(uid uint32) SpecOpts {
|
|||||||
if err != nil {
|
if err != nil {
|
||||||
return err
|
return err
|
||||||
}
|
}
|
||||||
|
|
||||||
return mount.WithTempMount(ctx, mounts, func(root string) error {
|
return mount.WithTempMount(ctx, mounts, func(root string) error {
|
||||||
ppath, err := fs.RootPath(root, "/etc/passwd")
|
uuid, ugid, err := getUIDGIDFromPath(root, func(u user.User) bool {
|
||||||
if err != nil {
|
|
||||||
return err
|
|
||||||
}
|
|
||||||
f, err := os.Open(ppath)
|
|
||||||
if err != nil {
|
|
||||||
if os.IsNotExist(err) {
|
|
||||||
s.Process.User.UID, s.Process.User.GID = uid, uid
|
|
||||||
return nil
|
|
||||||
}
|
|
||||||
return err
|
|
||||||
}
|
|
||||||
defer f.Close()
|
|
||||||
users, err := user.ParsePasswdFilter(f, func(u user.User) bool {
|
|
||||||
return u.Uid == int(uid)
|
return u.Uid == int(uid)
|
||||||
})
|
})
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return err
|
if os.IsNotExist(err) || err == errNoUsersFound {
|
||||||
}
|
|
||||||
if len(users) == 0 {
|
|
||||||
s.Process.User.UID, s.Process.User.GID = uid, uid
|
s.Process.User.UID, s.Process.User.GID = uid, uid
|
||||||
return nil
|
return nil
|
||||||
}
|
}
|
||||||
u := users[0]
|
return err
|
||||||
s.Process.User.UID, s.Process.User.GID = uint32(u.Uid), uint32(u.Gid)
|
}
|
||||||
|
s.Process.User.UID, s.Process.User.GID = uuid, ugid
|
||||||
return nil
|
return nil
|
||||||
})
|
})
|
||||||
}
|
}
|
||||||
@ -308,6 +309,19 @@ func WithUserID(uid uint32) SpecOpts {
|
|||||||
// it returns error.
|
// it returns error.
|
||||||
func WithUsername(username string) SpecOpts {
|
func WithUsername(username string) SpecOpts {
|
||||||
return func(ctx context.Context, client Client, c *containers.Container, s *specs.Spec) (err error) {
|
return func(ctx context.Context, client Client, c *containers.Container, s *specs.Spec) (err error) {
|
||||||
|
if c.Snapshotter == "" && c.SnapshotKey == "" {
|
||||||
|
if !isRootfsAbs(s.Root.Path) {
|
||||||
|
return errors.Errorf("rootfs absolute path is required")
|
||||||
|
}
|
||||||
|
uid, gid, err := getUIDGIDFromPath(s.Root.Path, func(u user.User) bool {
|
||||||
|
return u.Name == username
|
||||||
|
})
|
||||||
|
if err != nil {
|
||||||
|
return err
|
||||||
|
}
|
||||||
|
s.Process.User.UID, s.Process.User.GID = uid, gid
|
||||||
|
return nil
|
||||||
|
}
|
||||||
if c.Snapshotter == "" {
|
if c.Snapshotter == "" {
|
||||||
return errors.Errorf("no snapshotter set for container")
|
return errors.Errorf("no snapshotter set for container")
|
||||||
}
|
}
|
||||||
@ -320,27 +334,41 @@ func WithUsername(username string) SpecOpts {
|
|||||||
return err
|
return err
|
||||||
}
|
}
|
||||||
return mount.WithTempMount(ctx, mounts, func(root string) error {
|
return mount.WithTempMount(ctx, mounts, func(root string) error {
|
||||||
ppath, err := fs.RootPath(root, "/etc/passwd")
|
uid, gid, err := getUIDGIDFromPath(root, func(u user.User) bool {
|
||||||
if err != nil {
|
|
||||||
return err
|
|
||||||
}
|
|
||||||
f, err := os.Open(ppath)
|
|
||||||
if err != nil {
|
|
||||||
return err
|
|
||||||
}
|
|
||||||
defer f.Close()
|
|
||||||
users, err := user.ParsePasswdFilter(f, func(u user.User) bool {
|
|
||||||
return u.Name == username
|
return u.Name == username
|
||||||
})
|
})
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return err
|
return err
|
||||||
}
|
}
|
||||||
if len(users) == 0 {
|
s.Process.User.UID, s.Process.User.GID = uid, gid
|
||||||
return errors.Errorf("no users found for %s", username)
|
|
||||||
}
|
|
||||||
u := users[0]
|
|
||||||
s.Process.User.UID, s.Process.User.GID = uint32(u.Uid), uint32(u.Gid)
|
|
||||||
return nil
|
return nil
|
||||||
})
|
})
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
var errNoUsersFound = errors.New("no users found")
|
||||||
|
|
||||||
|
func getUIDGIDFromPath(root string, filter func(user.User) bool) (uid, gid uint32, err error) {
|
||||||
|
ppath, err := fs.RootPath(root, "/etc/passwd")
|
||||||
|
if err != nil {
|
||||||
|
return 0, 0, err
|
||||||
|
}
|
||||||
|
f, err := os.Open(ppath)
|
||||||
|
if err != nil {
|
||||||
|
return 0, 0, err
|
||||||
|
}
|
||||||
|
defer f.Close()
|
||||||
|
users, err := user.ParsePasswdFilter(f, filter)
|
||||||
|
if err != nil {
|
||||||
|
return 0, 0, err
|
||||||
|
}
|
||||||
|
if len(users) == 0 {
|
||||||
|
return 0, 0, errNoUsersFound
|
||||||
|
}
|
||||||
|
u := users[0]
|
||||||
|
return uint32(u.Uid), uint32(u.Gid), nil
|
||||||
|
}
|
||||||
|
|
||||||
|
func isRootfsAbs(root string) bool {
|
||||||
|
return filepath.IsAbs(root)
|
||||||
|
}
|
||||||
|
3
vendor/github.com/containerd/containerd/plugin/context.go
generated
vendored
3
vendor/github.com/containerd/containerd/plugin/context.go
generated
vendored
@ -6,7 +6,6 @@ import (
|
|||||||
|
|
||||||
"github.com/containerd/containerd/errdefs"
|
"github.com/containerd/containerd/errdefs"
|
||||||
"github.com/containerd/containerd/events/exchange"
|
"github.com/containerd/containerd/events/exchange"
|
||||||
"github.com/containerd/containerd/log"
|
|
||||||
ocispec "github.com/opencontainers/image-spec/specs-go/v1"
|
ocispec "github.com/opencontainers/image-spec/specs-go/v1"
|
||||||
"github.com/pkg/errors"
|
"github.com/pkg/errors"
|
||||||
)
|
)
|
||||||
@ -28,7 +27,7 @@ type InitContext struct {
|
|||||||
// NewContext returns a new plugin InitContext
|
// NewContext returns a new plugin InitContext
|
||||||
func NewContext(ctx context.Context, r *Registration, plugins *Set, root, state string) *InitContext {
|
func NewContext(ctx context.Context, r *Registration, plugins *Set, root, state string) *InitContext {
|
||||||
return &InitContext{
|
return &InitContext{
|
||||||
Context: log.WithModule(ctx, r.URI()),
|
Context: ctx,
|
||||||
Root: filepath.Join(root, r.URI()),
|
Root: filepath.Join(root, r.URI()),
|
||||||
State: filepath.Join(state, r.URI()),
|
State: filepath.Join(state, r.URI()),
|
||||||
Meta: &Meta{
|
Meta: &Meta{
|
||||||
|
Loading…
Reference in New Issue
Block a user