 d7864eb77b
			
		
	
	d7864eb77b
	
	
	
		
			
			By default, the generated spec will place containers in cgroups by their ids, we need to use the namespace as the cgroup root to avoid containers with the same name being placed in the same cgroup. ``` 11:perf_event:/to/redis 10:freezer:/to/redis 9:memory:/to/redis 8:devices:/to/redis 7:net_cls,net_prio:/to/redis 6:pids:/to/redis 5:hugetlb:/to/redis 4:cpuset:/to/redis 3:blkio:/to/redis 2:cpu,cpuacct:/to/redis 1:name=systemd:/to/redis 11:perf_event:/te/redis 10:freezer:/te/redis 9:memory:/te/redis 8:devices:/te/redis 7:net_cls,net_prio:/te/redis 6:pids:/te/redis 5:hugetlb:/te/redis 4:cpuset:/te/redis 3:blkio:/te/redis 2:cpu,cpuacct:/te/redis 1:name=systemd:/te/redis ``` Signed-off-by: Michael Crosby <crosbymichael@gmail.com>
		
			
				
	
	
		
			75 lines
		
	
	
		
			1.9 KiB
		
	
	
	
		
			Go
		
	
	
	
	
	
			
		
		
	
	
			75 lines
		
	
	
		
			1.9 KiB
		
	
	
	
		
			Go
		
	
	
	
	
	
| package containerd
 | |
| 
 | |
| import (
 | |
| 	"context"
 | |
| 
 | |
| 	"github.com/containerd/containerd/containers"
 | |
| 	"github.com/containerd/typeurl"
 | |
| 	specs "github.com/opencontainers/runtime-spec/specs-go"
 | |
| )
 | |
| 
 | |
| // SpecOpts sets spec specific information to a newly generated OCI spec
 | |
| type SpecOpts func(context.Context, *Client, *containers.Container, *specs.Spec) error
 | |
| 
 | |
| // WithProcessArgs replaces the args on the generated spec
 | |
| func WithProcessArgs(args ...string) SpecOpts {
 | |
| 	return func(_ context.Context, _ *Client, _ *containers.Container, s *specs.Spec) error {
 | |
| 		s.Process.Args = args
 | |
| 		return nil
 | |
| 	}
 | |
| }
 | |
| 
 | |
| // WithProcessCwd replaces the current working directory on the generated spec
 | |
| func WithProcessCwd(cwd string) SpecOpts {
 | |
| 	return func(_ context.Context, _ *Client, _ *containers.Container, s *specs.Spec) error {
 | |
| 		s.Process.Cwd = cwd
 | |
| 		return nil
 | |
| 	}
 | |
| }
 | |
| 
 | |
| // WithHostname sets the container's hostname
 | |
| func WithHostname(name string) SpecOpts {
 | |
| 	return func(_ context.Context, _ *Client, _ *containers.Container, s *specs.Spec) error {
 | |
| 		s.Hostname = name
 | |
| 		return nil
 | |
| 	}
 | |
| }
 | |
| 
 | |
| // WithNewSpec generates a new spec for a new container
 | |
| func WithNewSpec(opts ...SpecOpts) NewContainerOpts {
 | |
| 	return func(ctx context.Context, client *Client, c *containers.Container) error {
 | |
| 		s, err := createDefaultSpec(ctx, c.ID)
 | |
| 		if err != nil {
 | |
| 			return err
 | |
| 		}
 | |
| 		for _, o := range opts {
 | |
| 			if err := o(ctx, client, c, s); err != nil {
 | |
| 				return err
 | |
| 			}
 | |
| 		}
 | |
| 		any, err := typeurl.MarshalAny(s)
 | |
| 		if err != nil {
 | |
| 			return err
 | |
| 		}
 | |
| 		c.Spec = any
 | |
| 		return nil
 | |
| 	}
 | |
| }
 | |
| 
 | |
| // WithSpec sets the provided spec on the container
 | |
| func WithSpec(s *specs.Spec, opts ...SpecOpts) NewContainerOpts {
 | |
| 	return func(ctx context.Context, client *Client, c *containers.Container) error {
 | |
| 		for _, o := range opts {
 | |
| 			if err := o(ctx, client, c, s); err != nil {
 | |
| 				return err
 | |
| 			}
 | |
| 		}
 | |
| 		any, err := typeurl.MarshalAny(s)
 | |
| 		if err != nil {
 | |
| 			return err
 | |
| 		}
 | |
| 		c.Spec = any
 | |
| 		return nil
 | |
| 	}
 | |
| }
 |