 62e22a9fe7
			
		
	
	62e22a9fe7
	
	
	
		
			
			This allows Go to build third party packages correctly without vendoring issues what want to create their own SpecOpts. Fixes #2289 Signed-off-by: Michael Crosby <crosbymichael@gmail.com>
		
			
				
	
	
		
			186 lines
		
	
	
		
			3.9 KiB
		
	
	
	
		
			Go
		
	
	
	
	
	
			
		
		
	
	
			186 lines
		
	
	
		
			3.9 KiB
		
	
	
	
		
			Go
		
	
	
	
	
	
| // +build !windows
 | |
| 
 | |
| /*
 | |
|    Copyright The containerd Authors.
 | |
| 
 | |
|    Licensed under the Apache License, Version 2.0 (the "License");
 | |
|    you may not use this file except in compliance with the License.
 | |
|    You may obtain a copy of the License at
 | |
| 
 | |
|        http://www.apache.org/licenses/LICENSE-2.0
 | |
| 
 | |
|    Unless required by applicable law or agreed to in writing, software
 | |
|    distributed under the License is distributed on an "AS IS" BASIS,
 | |
|    WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
 | |
|    See the License for the specific language governing permissions and
 | |
|    limitations under the License.
 | |
| */
 | |
| 
 | |
| package oci
 | |
| 
 | |
| import (
 | |
| 	"context"
 | |
| 	"path/filepath"
 | |
| 
 | |
| 	"github.com/containerd/containerd/namespaces"
 | |
| 	specs "github.com/opencontainers/runtime-spec/specs-go"
 | |
| )
 | |
| 
 | |
| const (
 | |
| 	rwm               = "rwm"
 | |
| 	defaultRootfsPath = "rootfs"
 | |
| )
 | |
| 
 | |
| var (
 | |
| 	defaultEnv = []string{
 | |
| 		"PATH=/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin",
 | |
| 	}
 | |
| )
 | |
| 
 | |
| func defaultCaps() []string {
 | |
| 	return []string{
 | |
| 		"CAP_CHOWN",
 | |
| 		"CAP_DAC_OVERRIDE",
 | |
| 		"CAP_FSETID",
 | |
| 		"CAP_FOWNER",
 | |
| 		"CAP_MKNOD",
 | |
| 		"CAP_NET_RAW",
 | |
| 		"CAP_SETGID",
 | |
| 		"CAP_SETUID",
 | |
| 		"CAP_SETFCAP",
 | |
| 		"CAP_SETPCAP",
 | |
| 		"CAP_NET_BIND_SERVICE",
 | |
| 		"CAP_SYS_CHROOT",
 | |
| 		"CAP_KILL",
 | |
| 		"CAP_AUDIT_WRITE",
 | |
| 	}
 | |
| }
 | |
| 
 | |
| func defaultNamespaces() []specs.LinuxNamespace {
 | |
| 	return []specs.LinuxNamespace{
 | |
| 		{
 | |
| 			Type: specs.PIDNamespace,
 | |
| 		},
 | |
| 		{
 | |
| 			Type: specs.IPCNamespace,
 | |
| 		},
 | |
| 		{
 | |
| 			Type: specs.UTSNamespace,
 | |
| 		},
 | |
| 		{
 | |
| 			Type: specs.MountNamespace,
 | |
| 		},
 | |
| 		{
 | |
| 			Type: specs.NetworkNamespace,
 | |
| 		},
 | |
| 	}
 | |
| }
 | |
| 
 | |
| func createDefaultSpec(ctx context.Context, id string) (*Spec, error) {
 | |
| 	ns, err := namespaces.NamespaceRequired(ctx)
 | |
| 	if err != nil {
 | |
| 		return nil, err
 | |
| 	}
 | |
| 	s := &Spec{
 | |
| 		Version: specs.Version,
 | |
| 		Root: &specs.Root{
 | |
| 			Path: defaultRootfsPath,
 | |
| 		},
 | |
| 		Process: &specs.Process{
 | |
| 			Env:             defaultEnv,
 | |
| 			Cwd:             "/",
 | |
| 			NoNewPrivileges: true,
 | |
| 			User: specs.User{
 | |
| 				UID: 0,
 | |
| 				GID: 0,
 | |
| 			},
 | |
| 			Capabilities: &specs.LinuxCapabilities{
 | |
| 				Bounding:    defaultCaps(),
 | |
| 				Permitted:   defaultCaps(),
 | |
| 				Inheritable: defaultCaps(),
 | |
| 				Effective:   defaultCaps(),
 | |
| 			},
 | |
| 			Rlimits: []specs.POSIXRlimit{
 | |
| 				{
 | |
| 					Type: "RLIMIT_NOFILE",
 | |
| 					Hard: uint64(1024),
 | |
| 					Soft: uint64(1024),
 | |
| 				},
 | |
| 			},
 | |
| 		},
 | |
| 		Mounts: []specs.Mount{
 | |
| 			{
 | |
| 				Destination: "/proc",
 | |
| 				Type:        "proc",
 | |
| 				Source:      "proc",
 | |
| 			},
 | |
| 			{
 | |
| 				Destination: "/dev",
 | |
| 				Type:        "tmpfs",
 | |
| 				Source:      "tmpfs",
 | |
| 				Options:     []string{"nosuid", "strictatime", "mode=755", "size=65536k"},
 | |
| 			},
 | |
| 			{
 | |
| 				Destination: "/dev/pts",
 | |
| 				Type:        "devpts",
 | |
| 				Source:      "devpts",
 | |
| 				Options:     []string{"nosuid", "noexec", "newinstance", "ptmxmode=0666", "mode=0620", "gid=5"},
 | |
| 			},
 | |
| 			{
 | |
| 				Destination: "/dev/shm",
 | |
| 				Type:        "tmpfs",
 | |
| 				Source:      "shm",
 | |
| 				Options:     []string{"nosuid", "noexec", "nodev", "mode=1777", "size=65536k"},
 | |
| 			},
 | |
| 			{
 | |
| 				Destination: "/dev/mqueue",
 | |
| 				Type:        "mqueue",
 | |
| 				Source:      "mqueue",
 | |
| 				Options:     []string{"nosuid", "noexec", "nodev"},
 | |
| 			},
 | |
| 			{
 | |
| 				Destination: "/sys",
 | |
| 				Type:        "sysfs",
 | |
| 				Source:      "sysfs",
 | |
| 				Options:     []string{"nosuid", "noexec", "nodev", "ro"},
 | |
| 			},
 | |
| 			{
 | |
| 				Destination: "/run",
 | |
| 				Type:        "tmpfs",
 | |
| 				Source:      "tmpfs",
 | |
| 				Options:     []string{"nosuid", "strictatime", "mode=755", "size=65536k"},
 | |
| 			},
 | |
| 		},
 | |
| 		Linux: &specs.Linux{
 | |
| 			MaskedPaths: []string{
 | |
| 				"/proc/kcore",
 | |
| 				"/proc/latency_stats",
 | |
| 				"/proc/timer_list",
 | |
| 				"/proc/timer_stats",
 | |
| 				"/proc/sched_debug",
 | |
| 				"/sys/firmware",
 | |
| 				"/proc/scsi",
 | |
| 			},
 | |
| 			ReadonlyPaths: []string{
 | |
| 				"/proc/asound",
 | |
| 				"/proc/bus",
 | |
| 				"/proc/fs",
 | |
| 				"/proc/irq",
 | |
| 				"/proc/sys",
 | |
| 				"/proc/sysrq-trigger",
 | |
| 			},
 | |
| 			CgroupsPath: filepath.Join("/", ns, id),
 | |
| 			Resources: &specs.LinuxResources{
 | |
| 				Devices: []specs.LinuxDeviceCgroup{
 | |
| 					{
 | |
| 						Allow:  false,
 | |
| 						Access: rwm,
 | |
| 					},
 | |
| 				},
 | |
| 			},
 | |
| 			Namespaces: defaultNamespaces(),
 | |
| 		},
 | |
| 	}
 | |
| 	return s, nil
 | |
| }
 |