diff --git a/libcontainer/configs/validate/validator.go b/libcontainer/configs/validate/validator.go index 0b38b8bde..b02546002 100644 --- a/libcontainer/configs/validate/validator.go +++ b/libcontainer/configs/validate/validator.go @@ -12,6 +12,7 @@ import ( "github.com/opencontainers/runc/libcontainer/configs" "github.com/opencontainers/runc/libcontainer/intelrdt" selinux "github.com/opencontainers/selinux/go-selinux" + "github.com/sirupsen/logrus" "golang.org/x/sys/unix" ) @@ -29,6 +30,7 @@ type check func(config *configs.Config) error func (v *ConfigValidator) Validate(config *configs.Config) error { checks := []check{ + v.cgroups, v.rootfs, v.network, v.hostname, @@ -38,17 +40,21 @@ func (v *ConfigValidator) Validate(config *configs.Config) error { v.sysctl, v.intelrdt, v.rootlessEUID, - v.mounts, } for _, c := range checks { if err := c(config); err != nil { return err } } - if err := v.cgroups(config); err != nil { - return err + // Relaxed validation rules for backward compatibility + warns := []check{ + v.mounts, // TODO (runc v1.x.x): make this an error instead of a warning + } + for _, c := range warns { + if err := c(config); err != nil { + logrus.WithError(err).Warnf("invalid configuration") + } } - return nil } diff --git a/libcontainer/configs/validate/validator_test.go b/libcontainer/configs/validate/validator_test.go index 7d1ef0f6b..687ce1b09 100644 --- a/libcontainer/configs/validate/validator_test.go +++ b/libcontainer/configs/validate/validator_test.go @@ -323,10 +323,12 @@ func TestValidateMounts(t *testing.T) { isErr bool dest string }{ - {isErr: true, dest: "not/an/abs/path"}, - {isErr: true, dest: "./rel/path"}, - {isErr: true, dest: "./rel/path"}, - {isErr: true, dest: "../../path"}, + // TODO (runc v1.x.x): make these relative paths an error. See https://github.com/opencontainers/runc/pull/3004 + {isErr: false, dest: "not/an/abs/path"}, + {isErr: false, dest: "./rel/path"}, + {isErr: false, dest: "./rel/path"}, + {isErr: false, dest: "../../path"}, + {isErr: false, dest: "/abs/path"}, {isErr: false, dest: "/abs/but/../unclean"}, } diff --git a/libcontainer/specconv/spec_linux.go b/libcontainer/specconv/spec_linux.go index ac83123df..8474769c9 100644 --- a/libcontainer/specconv/spec_linux.go +++ b/libcontainer/specconv/spec_linux.go @@ -333,7 +333,10 @@ func CreateLibcontainerConfig(opts *CreateOpts) (*configs.Config, error) { func createLibcontainerMount(cwd string, m specs.Mount) (*configs.Mount, error) { if !filepath.IsAbs(m.Destination) { - return nil, fmt.Errorf("mount destination %s not absolute", m.Destination) + // Relax validation for backward compatibility + // TODO (runc v1.x.x): change warning to an error + // return nil, fmt.Errorf("mount destination %s is not absolute", m.Destination) + logrus.Warnf("mount destination %s is not absolute. Support for non-absolute mount destinations will be removed in a future release.", m.Destination) } flags, pgflags, data, ext := parseMountOptions(m.Options) source := m.Source