mirror of
https://github.com/moby/moby.git
synced 2022-11-09 12:21:53 -05:00
Initial driver changes proposal
Docker-DCO-1.1-Signed-off-by: Michael Crosby <michael@crosbymichael.com> (github: crosbymichael)
This commit is contained in:
parent
a823d7967f
commit
1ceb049118
2 changed files with 190 additions and 0 deletions
46
execdriver/driver.go
Normal file
46
execdriver/driver.go
Normal file
|
@ -0,0 +1,46 @@
|
|||
package execdriver
|
||||
|
||||
import (
|
||||
"io"
|
||||
"net"
|
||||
)
|
||||
|
||||
// Network settings of the container
|
||||
type Network struct {
|
||||
Gateway string
|
||||
IPAddress net.IPAddr
|
||||
IPPrefixLen int
|
||||
Mtu int
|
||||
}
|
||||
|
||||
// Container / Process / Whatever, we can redefine the conatiner here
|
||||
// to be what it should be and not have to carry the baggage of the
|
||||
// container type in the core with backward compat. This is what a
|
||||
// driver needs to execute a process inside of a conatiner. This is what
|
||||
// a container is at it's core.
|
||||
type Container struct {
|
||||
Name string // unique name for the conatienr
|
||||
Privileged bool
|
||||
User string
|
||||
Dir string // root fs of the container
|
||||
InitPath string // dockerinit
|
||||
Entrypoint string
|
||||
Args []string
|
||||
Environment map[string]string
|
||||
WorkingDir string
|
||||
Network *Network // if network is nil then networking is disabled
|
||||
Stdin io.Reader
|
||||
Stdout io.Writer
|
||||
Stderr io.Writer
|
||||
|
||||
Context interface{}
|
||||
}
|
||||
|
||||
// State can be handled internally in the drivers
|
||||
type Driver interface {
|
||||
Start(c *Container) error
|
||||
Stop(c *Container) error
|
||||
Kill(c *Container, sig int) error
|
||||
Running(c *Container) (bool, error)
|
||||
Wait(c *Container, seconds int) error
|
||||
}
|
144
execdriver/lxc/driver.go
Normal file
144
execdriver/lxc/driver.go
Normal file
|
@ -0,0 +1,144 @@
|
|||
package lxc
|
||||
|
||||
import (
|
||||
"github.com/dotcloud/docker/execdriver"
|
||||
"os/exec"
|
||||
"strconv"
|
||||
"sync"
|
||||
"syscall"
|
||||
)
|
||||
|
||||
const (
|
||||
startPath = "lxc-start"
|
||||
)
|
||||
|
||||
type driver struct {
|
||||
containerLock map[string]*sync.Mutex
|
||||
}
|
||||
|
||||
func NewDriver() (execdriver.Driver, error) {
|
||||
// setup unconfined symlink
|
||||
}
|
||||
|
||||
func (d *driver) Start(c *execdriver.Container) error {
|
||||
l := d.getLock(c)
|
||||
l.Lock()
|
||||
defer l.Unlock()
|
||||
|
||||
running, err := d.running(c)
|
||||
if err != nil {
|
||||
return err
|
||||
}
|
||||
if running {
|
||||
return nil
|
||||
}
|
||||
|
||||
configPath, err := d.generateConfig(c)
|
||||
if err != nil {
|
||||
return err
|
||||
}
|
||||
|
||||
params := []string{
|
||||
startPath,
|
||||
"-n", c.Name,
|
||||
"-f", configPath,
|
||||
"--",
|
||||
c.InitPath,
|
||||
}
|
||||
|
||||
if c.Network != nil {
|
||||
params = append(params,
|
||||
"-g", c.Network.Gateway,
|
||||
"-i", fmt.Sprintf("%s/%d", c.Network.IPAddress, c.Network, IPPrefixLen),
|
||||
"-mtu", c.Network.Mtu,
|
||||
)
|
||||
}
|
||||
|
||||
if c.User != "" {
|
||||
params = append(params, "-u", c.User)
|
||||
}
|
||||
|
||||
if c.Privileged {
|
||||
params = append(params, "-privileged")
|
||||
}
|
||||
|
||||
if c.WorkingDir != "" {
|
||||
params = append(params, "-w", c.WorkingDir)
|
||||
}
|
||||
|
||||
params = append(params, "--", c.Entrypoint)
|
||||
params = append(params, c.Args...)
|
||||
|
||||
cmd := exec.Command(params[0], params[1:]...)
|
||||
cmd.SysProcAttr = &syscall.SysProcAttr{Setsid: true}
|
||||
|
||||
cmd.Stdout = c.Stdout
|
||||
cmd.Stderr = c.Stderr
|
||||
cmd.Stdin = c.Stdin
|
||||
|
||||
if err := cmd.Start(); err != nil {
|
||||
return err
|
||||
}
|
||||
|
||||
// Poll for running
|
||||
if err := d.waitForStart(cmd, c); err != nil {
|
||||
return err
|
||||
}
|
||||
return nil
|
||||
}
|
||||
|
||||
func (d *driver) Stop(c *execdriver.Container) error {
|
||||
l := d.getLock(c)
|
||||
l.Lock()
|
||||
defer l.Unlock()
|
||||
|
||||
if err := d.kill(c, 15); err != nil {
|
||||
if err := d.kill(c, 9); err != nil {
|
||||
return err
|
||||
}
|
||||
}
|
||||
|
||||
if err := d.wait(c, 10); err != nil {
|
||||
return d.kill(c, 9)
|
||||
}
|
||||
return nil
|
||||
}
|
||||
|
||||
func (d *driver) Wait(c *execdriver.Container, seconds int) error {
|
||||
l := d.getLock(c)
|
||||
l.Lock()
|
||||
defer l.Unlock()
|
||||
|
||||
return d.wait(c, seconds)
|
||||
}
|
||||
|
||||
// If seconds < 0 then wait forever
|
||||
func (d *driver) wait(c *execdriver.Container, seconds int) error {
|
||||
|
||||
}
|
||||
|
||||
func (d *driver) kill(c *execdriver.Container, sig int) error {
|
||||
return exec.Command("lxc-kill", "-n", c.Name, strconv.Itoa(sig)).Run()
|
||||
}
|
||||
|
||||
func (d *driver) running(c *execdriver.Container) (bool, error) {
|
||||
|
||||
}
|
||||
|
||||
// Generate the lxc configuration and return the path to the file
|
||||
func (d *driver) generateConfig(c *execdriver.Container) (string, error) {
|
||||
|
||||
}
|
||||
|
||||
func (d *driver) waitForStart(cmd *exec.Cmd, c *execdriver.Container) error {
|
||||
|
||||
}
|
||||
|
||||
func (d *driver) getLock(c *execdriver.Container) *sync.Mutex {
|
||||
l, ok := d.containerLock[c.Name]
|
||||
if !ok {
|
||||
l = &sync.Mutex{}
|
||||
d.containerLock[c.Name] = l
|
||||
}
|
||||
return l
|
||||
}
|
Loading…
Reference in a new issue