654c537d38
This fixes a sync issue when the containerd api returns after a container has started. It fixes it by calling the runtime start inside containerd after the oom handler has been setup. Signed-off-by: Michael Crosby <crosbymichael@gmail.com>
123 lines
3.9 KiB
Go
123 lines
3.9 KiB
Go
package runtime
|
|
|
|
import (
|
|
"errors"
|
|
"time"
|
|
|
|
"github.com/docker/containerd/specs"
|
|
)
|
|
|
|
var (
|
|
// ErrContainerExited is returned when access to an exited
|
|
// container is attempted
|
|
ErrContainerExited = errors.New("containerd: container has exited")
|
|
// ErrProcessNotExited is returned when trying to retrieve the exit
|
|
// status of an alive process
|
|
ErrProcessNotExited = errors.New("containerd: process has not exited")
|
|
// ErrContainerNotStarted is returned when a container fails to
|
|
// start without error from the shim or the OCI runtime
|
|
ErrContainerNotStarted = errors.New("containerd: container not started")
|
|
// ErrContainerStartTimeout is returned if a container takes too
|
|
// long to start
|
|
ErrContainerStartTimeout = errors.New("containerd: container did not start before the specified timeout")
|
|
// ErrShimExited is returned if the shim or the contianer's init process
|
|
// exits before completing
|
|
ErrShimExited = errors.New("containerd: shim exited before container process was started")
|
|
|
|
errNoPidFile = errors.New("containerd: no process pid file found")
|
|
errInvalidPidInt = errors.New("containerd: process pid is invalid")
|
|
errNotImplemented = errors.New("containerd: not implemented")
|
|
)
|
|
|
|
const (
|
|
// ExitFile holds the name of the pipe used to monitor process
|
|
// exit
|
|
ExitFile = "exit"
|
|
// ExitStatusFile holds the name of the file where the container
|
|
// exit code is to be written
|
|
ExitStatusFile = "exitStatus"
|
|
// StateFile holds the name of the file where the container state
|
|
// is written
|
|
StateFile = "state.json"
|
|
// ControlFile holds the name of the pipe used to control the shim
|
|
ControlFile = "control"
|
|
// InitProcessID holds the special ID used for the very first
|
|
// container's process
|
|
InitProcessID = "init"
|
|
)
|
|
|
|
// Checkpoint holds information regarding a container checkpoint
|
|
type Checkpoint struct {
|
|
// Timestamp is the time that checkpoint happened
|
|
Created time.Time `json:"created"`
|
|
// Name is the name of the checkpoint
|
|
Name string `json:"name"`
|
|
// TCP checkpoints open tcp connections
|
|
TCP bool `json:"tcp"`
|
|
// UnixSockets persists unix sockets in the checkpoint
|
|
UnixSockets bool `json:"unixSockets"`
|
|
// Shell persists tty sessions in the checkpoint
|
|
Shell bool `json:"shell"`
|
|
// Exit exits the container after the checkpoint is finished
|
|
Exit bool `json:"exit"`
|
|
// EmptyNS tells CRIU to omit a specified namespace
|
|
EmptyNS []string `json:"emptyNS,omitempty"`
|
|
}
|
|
|
|
// PlatformProcessState container platform-specific fields in the ProcessState structure
|
|
type PlatformProcessState struct {
|
|
Checkpoint string `json:"checkpoint"`
|
|
RootUID int `json:"rootUID"`
|
|
RootGID int `json:"rootGID"`
|
|
}
|
|
|
|
// State represents a container state
|
|
type State string
|
|
|
|
// Resource regroups the various container limits that can be updated
|
|
type Resource struct {
|
|
CPUShares int64
|
|
BlkioWeight uint16
|
|
CPUPeriod int64
|
|
CPUQuota int64
|
|
CpusetCpus string
|
|
CpusetMems string
|
|
KernelMemory int64
|
|
KernelTCPMemory int64
|
|
Memory int64
|
|
MemoryReservation int64
|
|
MemorySwap int64
|
|
}
|
|
|
|
// Possible container states
|
|
const (
|
|
Paused = State("paused")
|
|
Stopped = State("stopped")
|
|
Running = State("running")
|
|
)
|
|
|
|
type state struct {
|
|
Bundle string `json:"bundle"`
|
|
Labels []string `json:"labels"`
|
|
Stdin string `json:"stdin"`
|
|
Stdout string `json:"stdout"`
|
|
Stderr string `json:"stderr"`
|
|
Runtime string `json:"runtime"`
|
|
RuntimeArgs []string `json:"runtimeArgs"`
|
|
Shim string `json:"shim"`
|
|
NoPivotRoot bool `json:"noPivotRoot"`
|
|
}
|
|
|
|
// ProcessState holds the process OCI specs along with various fields
|
|
// required by containerd
|
|
type ProcessState struct {
|
|
specs.ProcessSpec
|
|
Exec bool `json:"exec"`
|
|
Stdin string `json:"containerdStdin"`
|
|
Stdout string `json:"containerdStdout"`
|
|
Stderr string `json:"containerdStderr"`
|
|
RuntimeArgs []string `json:"runtimeArgs"`
|
|
NoPivotRoot bool `json:"noPivotRoot"`
|
|
|
|
PlatformProcessState
|
|
}
|