docker

package module
v0.1.1-0...-4a086df Latest Latest
Warning

This package is not in the latest version of its module.

Go to latest
Published: Mar 27, 2013 License: Apache-2.0 Imports: 32 Imported by: 0

README

Docker: the Linux container runtime

Docker complements LXC with a high-level API which operates at the process level. It runs unix processes with strong guarantees of isolation and repeatability across servers.

Docker is a great building block for automating distributed systems: large-scale web deployments, database clusters, continuous deployment systems, private PaaS, service-oriented architectures, etc.

  • Heterogeneous payloads: any combination of binaries, libraries, configuration files, scripts, virtualenvs, jars, gems, tarballs, you name it. No more juggling between domain-specific tools. Docker can deploy and run them all.

  • Any server: docker can run on any x64 machine with a modern linux kernel - whether it's a laptop, a bare metal server or a VM. This makes it perfect for multi-cloud deployments.

  • Isolation: docker isolates processes from each other and from the underlying host, using lightweight containers.

  • Repeatability: because containers are isolated in their own filesystem, they behave the same regardless of where, when, and alongside what they run.

Notable features

  • Filesystem isolation: each process container runs in a completely separate root filesystem.

  • Resource isolation: system resources like cpu and memory can be allocated differently to each process container, using cgroups.

  • Network isolation: each process container runs in its own network namespace, with a virtual interface and IP address of its own.

  • Copy-on-write: root filesystems are created using copy-on-write, which makes deployment extremeley fast, memory-cheap and disk-cheap.

  • Logging: the standard streams (stdout/stderr/stdin) of each process container are collected and logged for real-time or batch retrieval.

  • Change management: changes to a container's filesystem can be committed into a new image and re-used to create more containers. No templating or manual configuration required.

  • Interactive shell: docker can allocate a pseudo-tty and attach to the standard input of any container, for example to run a throwaway interactive shell.

Under the hood

Under the hood, Docker is built on the following components:

  • The cgroup and namespacing capabilities of the Linux kernel;

  • AUFS, a powerful union filesystem with copy-on-write capabilities;

  • The Go programming language;

  • lxc, a set of convenience scripts to simplify the creation of linux containers.

Install instructions

Installing on Ubuntu 12.04 and 12.10

  1. Install dependencies:

    sudo apt-get install lxc wget bsdtar curl
    sudo apt-get install linux-image-extra-`uname -r`
    

    The linux-image-extra package is needed on standard Ubuntu EC2 AMIs in order to install the aufs kernel module.

  2. Install the latest docker binary:

    wget http://get.docker.io/builds/$(uname -s)/$(uname -m)/docker-master.tgz
    tar -xf docker-master.tgz
    
  3. Run your first container!

    cd docker-master
    sudo ./docker pull base
    sudo ./docker run -i -t base /bin/bash
    

    Consider adding docker to your PATH for simplicity.

Installing on other Linux distributions

Right now, the officially supported distributions are:

  • Ubuntu 12.04 (precise LTS)
  • Ubuntu 12.10 (quantal)

Docker probably works on other distributions featuring a recent kernel, the AUFS patch, and up-to-date lxc. However this has not been tested.

Some streamlined (but possibly outdated) installation paths' are available from the website: http://docker.io/documentation/

Usage examples

Running an interactive shell

# Download a base image
docker pull base

# Run an interactive shell in the base image,
# allocate a tty, attach stdin and stdout
docker run -i -t base /bin/bash

Starting a long-running worker process

# Run docker in daemon mode
(docker -d || echo "Docker daemon already running") &

# Start a very useful long-running process
JOB=$(docker run -d base /bin/sh -c "while true; do echo Hello world; sleep 1; done")

# Collect the output of the job so far
docker logs $JOB

# Kill the job
docker kill $JOB

Listing all running containers

docker ps

Share your own image!

docker pull base
CONTAINER=$(docker run -d base apt-get install -y curl)
docker commit -m "Installed curl" $CONTAINER $USER/betterbase
docker push $USER/betterbase

Expose a service on a TCP port

# Expose port 4444 of this container, and tell netcat to listen on it
JOB=$(docker run -d -p 4444 base /bin/nc -l -p 4444)

# Which public port is NATed to my container?
PORT=$(docker port $JOB 4444)

# Connect to the public port via the host's public address
echo hello world | nc $(hostname) $PORT

# Verify that the network connection worked
echo "Daemon received: $(docker logs $JOB)"

Contributing to Docker

Want to hack on Docker? Awesome! There are instructions to get you started on the website: http://docker.io/documentation/contributing/contributing.html

They are probably not perfect, please let us know if anything feels wrong or incomplete.

Pull requests are always welcome

Note

We also keep the documentation in this repository. The website documentation is generated using sphinx using these sources. Please find it under docs/sources/ and read more about it https://github.com/dotcloud/docker/master/docs/README.md

Please feel free to fix / update the documentation and send us pull requests. More tutorials are also welcome.

Discuss your design on the mailing list

We recommend discussing your plans on the mailing list before starting to code - especially for more ambitious contributions. This gives other contributors a chance to point you in the right direction, give feedback on your design, and maybe point out if someone else is working on the same thing.

Create issues...

Any significant improvement should be documented as a github issue before anybody starts working on it.

...but check for existing issues first!

Please take a moment to check that an issue doesn't already exist documenting your bug report or improvement proposal. If it does, it never hurts to add a quick "+1" or "I have this problem too". This will help prioritize the most common problems and requests.

Write tests

Golang has a great testing suite built in: use it! Take a look at existing tests for inspiration.

Setting up a dev environment

Instructions that have been verified to work on Ubuntu 12.10,

sudo apt-get -y install lxc wget bsdtar curl golang git

export GOPATH=~/go/
export PATH=$GOPATH/bin:$PATH

mkdir -p $GOPATH/src/github.com/dotcloud
cd $GOPATH/src/github.com/dotcloud
git clone git@github.com:dotcloud/docker.git
cd docker

go get -v github.com/dotcloud/docker/...
go install -v github.com/dotcloud/docker/...

Then run the docker daemon,

sudo $GOPATH/bin/docker -d

Run the go install command (above) to recompile docker.

What is a Standard Container?

Docker defines a unit of software delivery called a Standard Container. The goal of a Standard Container is to encapsulate a software component and all its dependencies in a format that is self-describing and portable, so that any compliant runtime can run it without extra dependencies, regardless of the underlying machine and the contents of the container.

The spec for Standard Containers is currently a work in progress, but it is very straightforward. It mostly defines 1) an image format, 2) a set of standard operations, and 3) an execution environment.

A great analogy for this is the shipping container. Just like Standard Containers are a fundamental unit of software delivery, shipping containers (http://bricks.argz.com/ins/7823-1/12) are a fundamental unit of physical delivery.

1. STANDARD OPERATIONS

Just like shipping containers, Standard Containers define a set of STANDARD OPERATIONS. Shipping containers can be lifted, stacked, locked, loaded, unloaded and labelled. Similarly, standard containers can be started, stopped, copied, snapshotted, downloaded, uploaded and tagged.

2. CONTENT-AGNOSTIC

Just like shipping containers, Standard Containers are CONTENT-AGNOSTIC: all standard operations have the same effect regardless of the contents. A shipping container will be stacked in exactly the same way whether it contains Vietnamese powder coffee or spare Maserati parts. Similarly, Standard Containers are started or uploaded in the same way whether they contain a postgres database, a php application with its dependencies and application server, or Java build artifacts.

3. INFRASTRUCTURE-AGNOSTIC

Both types of containers are INFRASTRUCTURE-AGNOSTIC: they can be transported to thousands of facilities around the world, and manipulated by a wide variety of equipment. A shipping container can be packed in a factory in Ukraine, transported by truck to the nearest routing center, stacked onto a train, loaded into a German boat by an Australian-built crane, stored in a warehouse at a US facility, etc. Similarly, a standard container can be bundled on my laptop, uploaded to S3, downloaded, run and snapshotted by a build server at Equinix in Virginia, uploaded to 10 staging servers in a home-made Openstack cluster, then sent to 30 production instances across 3 EC2 regions.

4. DESIGNED FOR AUTOMATION

Because they offer the same standard operations regardless of content and infrastructure, Standard Containers, just like their physical counterpart, are extremely well-suited for automation. In fact, you could say automation is their secret weapon.

Many things that once required time-consuming and error-prone human effort can now be programmed. Before shipping containers, a bag of powder coffee was hauled, dragged, dropped, rolled and stacked by 10 different people in 10 different locations by the time it reached its destination. 1 out of 50 disappeared. 1 out of 20 was damaged. The process was slow, inefficient and cost a fortune - and was entirely different depending on the facility and the type of goods.

Similarly, before Standard Containers, by the time a software component ran in production, it had been individually built, configured, bundled, documented, patched, vendored, templated, tweaked and instrumented by 10 different people on 10 different computers. Builds failed, libraries conflicted, mirrors crashed, post-it notes were lost, logs were misplaced, cluster updates were half-broken. The process was slow, inefficient and cost a fortune - and was entirely different depending on the language and infrastructure provider.

5. INDUSTRIAL-GRADE DELIVERY

There are 17 million shipping containers in existence, packed with every physical good imaginable. Every single one of them can be loaded on the same boats, by the same cranes, in the same facilities, and sent anywhere in the World with incredible efficiency. It is embarrassing to think that a 30 ton shipment of coffee can safely travel half-way across the World in less time than it takes a software team to deliver its code from one datacenter to another sitting 10 miles away.

With Standard Containers we can put an end to that embarrassment, by making INDUSTRIAL-GRADE DELIVERY of software a reality.

Standard Container Specification

(TODO)

Image format
Standard operations
  • Copy
  • Run
  • Stop
  • Wait
  • Commit
  • Attach standard streams
  • List filesystem changes
  • ...
Execution environment
Root filesystem
Environment variables
Process arguments
Networking
Process namespacing
Resource limits
Process monitoring
Logging
Signals
Pseudo-terminal allocation
Security

Documentation

Index

Constants

View Source
const (
	ChangeModify = iota
	ChangeAdd
	ChangeDelete
)
View Source
const DEFAULT_TAG = "latest"
View Source
const LxcTemplate = `` /* 2658-byte string literal not displayed */
View Source
const REGISTRY_ENDPOINT = auth.REGISTRY_SERVER + "/v1"

FIXME: Set the endpoint in a conf file or via commandline const REGISTRY_ENDPOINT = "http://registry-creack.dotcloud.com/v1"

View Source
const VERSION = "0.1.0"

Variables

View Source
var LxcTemplateCompiled *template.Template

Functions

func CmdStream

func CmdStream(cmd *exec.Cmd) (io.Reader, error)

func Debugf

func Debugf(format string, a ...interface{})

Debug function, if the debug flag is set, then display. Do nothing otherwise If Docker is in damon mode, also send the debug info on the socket

func Download

func Download(url string, stderr io.Writer) (*http.Response, error)

Request a given URL and return an io.Reader

func GenerateId

func GenerateId() string

func Go

func Go(f func() error) chan error

Go is a basic promise implementation: it wraps calls a function in a goroutine, and returns a channel which will later return the function's return value.

func HumanDuration

func HumanDuration(d time.Duration) string

HumanDuration returns a human-readable approximation of a duration (eg. "About a minute", "4 hours ago", etc.)

func MountAUFS

func MountAUFS(ro []string, rw string, target string) error

func Mounted

func Mounted(mountpoint string) (bool, error)

func NopWriteCloser

func NopWriteCloser(w io.Writer) io.WriteCloser

func ProgressReader

func ProgressReader(r io.ReadCloser, size int, output io.Writer) *progressReader

func SelfPath

func SelfPath() string

Figure out the absolute path of our own binary

func StoreImage

func StoreImage(img *Image, layerData Archive, root string) error

func SysInit

func SysInit()

Sys Init code This code is run INSIDE the container and is responsible for setting up the environment before running the actual process

func Tar

func Tar(path string, compression Compression) (io.Reader, error)

func Trunc

func Trunc(s string, maxlen int) string

func Unmount

func Unmount(target string) error

func Untar

func Untar(archive io.Reader, path string) error

func ValidateId

func ValidateId(id string) error

Types

type Archive

type Archive io.Reader

type Change

type Change struct {
	Path string
	Kind ChangeType
}

func Changes

func Changes(layers []string, rw string) ([]Change, error)

func (*Change) String

func (change *Change) String() string

type ChangeType

type ChangeType int

type Compression

type Compression uint32
const (
	Uncompressed Compression = iota
	Bzip2
	Gzip
)

func (*Compression) Flag

func (compression *Compression) Flag() string

type Config

type Config struct {
	Hostname   string
	User       string
	Memory     int64 // Memory limit (in bytes)
	MemorySwap int64 // Total memory usage (memory + swap); set `-1' to disable swap
	Detach     bool
	Ports      []int
	Tty        bool // Attach standard streams to a tty, including stdin if it is not closed.
	OpenStdin  bool // Open stdin
	Env        []string
	Cmd        []string
	Image      string // Name of the image as it was passed by the operator (eg. could be symbolic)
}

func ParseRun

func ParseRun(args []string, stdout io.Writer) (*Config, error)

type Container

type Container struct {
	Id string

	Created time.Time

	Path string
	Args []string

	Config *Config
	State  State
	Image  string

	NetworkSettings *NetworkSettings

	SysInitPath string
	// contains filtered or unexported fields
}

func (*Container) Changes

func (container *Container) Changes() ([]Change, error)

func (*Container) Cmd

func (container *Container) Cmd() *exec.Cmd

func (*Container) EnsureMounted

func (container *Container) EnsureMounted() error

func (*Container) Export

func (container *Container) Export() (Archive, error)

func (*Container) ExportRw

func (container *Container) ExportRw() (Archive, error)

func (*Container) FromDisk

func (container *Container) FromDisk() error

func (*Container) GetImage

func (container *Container) GetImage() (*Image, error)

func (*Container) Kill

func (container *Container) Kill() error

func (*Container) Mount

func (container *Container) Mount() error

func (*Container) Mounted

func (container *Container) Mounted() (bool, error)

func (*Container) Output

func (container *Container) Output() (output []byte, err error)

func (*Container) ReadLog

func (container *Container) ReadLog(name string) (io.Reader, error)

func (*Container) Restart

func (container *Container) Restart() error

func (*Container) RootfsPath

func (container *Container) RootfsPath() string

This method must be exported to be used from the lxc template

func (*Container) Run

func (container *Container) Run() error

func (*Container) Start

func (container *Container) Start() error

func (*Container) StderrPipe

func (container *Container) StderrPipe() (io.ReadCloser, error)

func (*Container) StdinPipe

func (container *Container) StdinPipe() (io.WriteCloser, error)

StdinPipe() returns a pipe connected to the standard input of the container's active process.

func (*Container) StdoutPipe

func (container *Container) StdoutPipe() (io.ReadCloser, error)

func (*Container) Stop

func (container *Container) Stop() error

func (*Container) ToDisk

func (container *Container) ToDisk() (err error)

func (*Container) Unmount

func (container *Container) Unmount() error

func (*Container) Wait

func (container *Container) Wait() int

Wait blocks until the container stops running, then returns its exit code.

func (*Container) WaitTimeout

func (container *Container) WaitTimeout(timeout time.Duration) error

func (*Container) When

func (container *Container) When() time.Time

type Graph

type Graph struct {
	Root string
}

func NewGraph

func NewGraph(root string) (*Graph, error)

func (*Graph) All

func (graph *Graph) All() ([]*Image, error)

func (*Graph) ByParent

func (graph *Graph) ByParent() (map[string][]*Image, error)

func (*Graph) Create

func (graph *Graph) Create(layerData Archive, container *Container, comment string) (*Image, error)

func (*Graph) Delete

func (graph *Graph) Delete(id string) error

func (*Graph) Exists

func (graph *Graph) Exists(id string) bool

func (*Graph) Garbage

func (graph *Graph) Garbage() (*Graph, error)

func (*Graph) GarbageCollect

func (graph *Graph) GarbageCollect() error

func (*Graph) Get

func (graph *Graph) Get(id string) (*Image, error)

func (*Graph) Heads

func (graph *Graph) Heads() (map[string]*Image, error)

func (*Graph) IsNotExist

func (graph *Graph) IsNotExist(err error) bool

FIXME: Implement error subclass instead of looking at the error text Note: This is the way golang implements os.IsNotExists on Plan9

func (*Graph) LookupRemoteImage

func (graph *Graph) LookupRemoteImage(imgId string, authConfig *auth.AuthConfig) bool

Check if an image exists in the Registry

func (*Graph) LookupRemoteRepository

func (graph *Graph) LookupRemoteRepository(remote string, authConfig *auth.AuthConfig) bool

func (*Graph) Map

func (graph *Graph) Map() (map[string]*Image, error)

func (*Graph) Mktemp

func (graph *Graph) Mktemp(id string) (string, error)

func (*Graph) PullImage

func (graph *Graph) PullImage(stdout io.Writer, imgId string, authConfig *auth.AuthConfig) error

func (*Graph) PullRepository

func (graph *Graph) PullRepository(stdout io.Writer, remote, askedTag string, repositories *TagStore, authConfig *auth.AuthConfig) error

FIXME: Handle the askedTag parameter

func (*Graph) PushImage

func (graph *Graph) PushImage(stdout io.Writer, imgOrig *Image, authConfig *auth.AuthConfig) error

Push a local image to the registry with its history if needed

func (*Graph) PushRepository

func (graph *Graph) PushRepository(stdout io.Writer, remote string, localRepo Repository, authConfig *auth.AuthConfig) error

Push a repository to the registry. Remote has the format '<user>/<repo>

func (*Graph) Register

func (graph *Graph) Register(layerData Archive, img *Image) error

func (*Graph) Undelete

func (graph *Graph) Undelete(id string) error

func (*Graph) WalkAll

func (graph *Graph) WalkAll(handler func(*Image)) error

type History

type History []*Container

func (*History) Add

func (history *History) Add(container *Container)

func (*History) Len

func (history *History) Len() int

func (*History) Less

func (history *History) Less(i, j int) bool

func (*History) Swap

func (history *History) Swap(i, j int)

type IPAllocator

type IPAllocator struct {
	// contains filtered or unexported fields
}

IP allocator: Atomatically allocate and release networking ports

func (*IPAllocator) Acquire

func (alloc *IPAllocator) Acquire() (net.IP, error)

func (*IPAllocator) Release

func (alloc *IPAllocator) Release(ip net.IP) error

type Image

type Image struct {
	Id              string    `json:"id"`
	Parent          string    `json:"parent,omitempty"`
	Comment         string    `json:"comment,omitempty"`
	Created         time.Time `json:"created"`
	Container       string    `json:"container,omitempty"`
	ContainerConfig Config    `json:"container_config,omitempty"`
	// contains filtered or unexported fields
}

func LoadImage

func LoadImage(root string) (*Image, error)

func NewImgJson

func NewImgJson(src []byte) (*Image, error)

Build an Image object from raw json data

func NewMultipleImgJson

func NewMultipleImgJson(src []byte) ([]*Image, error)

Build an Image object list from a raw json data FIXME: Do this in "stream" mode

func (*Image) Changes

func (image *Image) Changes(rw string) ([]Change, error)

func (*Image) GetParent

func (img *Image) GetParent() (*Image, error)

func (*Image) History

func (img *Image) History() ([]*Image, error)

Image includes convenience proxy functions to its graph These functions will return an error if the image is not registered (ie. if image.graph == nil)

func (*Image) Mount

func (image *Image) Mount(root, rw string) error

func (*Image) WalkHistory

func (img *Image) WalkHistory(handler func(*Image) error) (err error)

type ListOpts

type ListOpts []string

ListOpts type

func (*ListOpts) Set

func (opts *ListOpts) Set(value string) error

func (*ListOpts) String

func (opts *ListOpts) String() string

type NetworkInterface

type NetworkInterface struct {
	IPNet   net.IPNet
	Gateway net.IP
	// contains filtered or unexported fields
}

Network interface represents the networking stack of a container

func (*NetworkInterface) AllocatePort

func (iface *NetworkInterface) AllocatePort(port int) (int, error)

Allocate an external TCP port and map it to the interface

func (*NetworkInterface) Release

func (iface *NetworkInterface) Release() error

Release: Network cleanup - release all resources

type NetworkManager

type NetworkManager struct {
	// contains filtered or unexported fields
}

Network Manager manages a set of network interfaces Only *one* manager per host machine should be used

func (*NetworkManager) Allocate

func (manager *NetworkManager) Allocate() (*NetworkInterface, error)

Allocate a network interface

type NetworkSettings

type NetworkSettings struct {
	IpAddress   string
	IpPrefixLen int
	Gateway     string
	PortMapping map[string]string
}

type PortAllocator

type PortAllocator struct {
	// contains filtered or unexported fields
}

Port allocator: Atomatically allocate and release networking ports

func (*PortAllocator) Acquire

func (alloc *PortAllocator) Acquire() (int, error)

func (*PortAllocator) Release

func (alloc *PortAllocator) Release(port int) error

type PortMapper

type PortMapper struct {
	// contains filtered or unexported fields
}

Port mapper takes care of mapping external ports to containers by setting up iptables rules. It keeps track of all mappings and is able to unmap at will

func (*PortMapper) Map

func (mapper *PortMapper) Map(port int, dest net.TCPAddr) error

func (*PortMapper) Unmap

func (mapper *PortMapper) Unmap(port int) error

type Repository

type Repository map[string]string

type Runtime

type Runtime struct {
	// contains filtered or unexported fields
}

func NewRuntime

func NewRuntime() (*Runtime, error)

func NewRuntimeFromDirectory

func NewRuntimeFromDirectory(root string) (*Runtime, error)

func (*Runtime) Commit

func (runtime *Runtime) Commit(id, repository, tag, comment string) (*Image, error)

Commit creates a new filesystem image from the current state of a container. The image can optionally be tagged into a repository

func (*Runtime) Create

func (runtime *Runtime) Create(config *Config) (*Container, error)

func (*Runtime) Destroy

func (runtime *Runtime) Destroy(container *Container) error

func (*Runtime) Exists

func (runtime *Runtime) Exists(id string) bool

func (*Runtime) Get

func (runtime *Runtime) Get(id string) *Container

func (*Runtime) List

func (runtime *Runtime) List() []*Container

func (*Runtime) Load

func (runtime *Runtime) Load(id string) (*Container, error)

func (*Runtime) LogToDisk

func (runtime *Runtime) LogToDisk(src *writeBroadcaster, dst string) error

func (*Runtime) Register

func (runtime *Runtime) Register(container *Container) error

Register makes a container object usable by the runtime as <container.Id>

type Server

type Server struct {
	// contains filtered or unexported fields
}

func NewServer

func NewServer() (*Server, error)

func (*Server) CmdAttach

func (srv *Server) CmdAttach(stdin io.ReadCloser, stdout io.Writer, args ...string) error

func (*Server) CmdCommit

func (srv *Server) CmdCommit(stdin io.ReadCloser, stdout io.Writer, args ...string) error

func (*Server) CmdDiff

func (srv *Server) CmdDiff(stdin io.ReadCloser, stdout io.Writer, args ...string) error

func (*Server) CmdExport

func (srv *Server) CmdExport(stdin io.ReadCloser, stdout io.Writer, args ...string) error

func (*Server) CmdHistory

func (srv *Server) CmdHistory(stdin io.ReadCloser, stdout io.Writer, args ...string) error

func (*Server) CmdImages

func (srv *Server) CmdImages(stdin io.ReadCloser, stdout io.Writer, args ...string) error

func (*Server) CmdImport

func (srv *Server) CmdImport(stdin io.ReadCloser, stdout io.Writer, args ...string) error

func (*Server) CmdInfo

func (srv *Server) CmdInfo(stdin io.ReadCloser, stdout io.Writer, args ...string) error

'docker info': display system-wide information.

func (*Server) CmdInspect

func (srv *Server) CmdInspect(stdin io.ReadCloser, stdout io.Writer, args ...string) error

func (*Server) CmdKill

func (srv *Server) CmdKill(stdin io.ReadCloser, stdout io.Writer, args ...string) error

'docker kill NAME' kills a running container

func (*Server) CmdLogin

func (srv *Server) CmdLogin(stdin io.ReadCloser, stdout io.Writer, args ...string) error

'docker login': login / register a user to registry service.

func (*Server) CmdLogs

func (srv *Server) CmdLogs(stdin io.ReadCloser, stdout io.Writer, args ...string) error

func (*Server) CmdPort

func (srv *Server) CmdPort(stdin io.ReadCloser, stdout io.Writer, args ...string) error

func (*Server) CmdPs

func (srv *Server) CmdPs(stdin io.ReadCloser, stdout io.Writer, args ...string) error

func (*Server) CmdPull

func (srv *Server) CmdPull(stdin io.ReadCloser, stdout io.Writer, args ...string) error

func (*Server) CmdPush

func (srv *Server) CmdPush(stdin io.ReadCloser, stdout io.Writer, args ...string) error

func (*Server) CmdRestart

func (srv *Server) CmdRestart(stdin io.ReadCloser, stdout io.Writer, args ...string) error

func (*Server) CmdRm

func (srv *Server) CmdRm(stdin io.ReadCloser, stdout io.Writer, args ...string) error

func (*Server) CmdRmi

func (srv *Server) CmdRmi(stdin io.ReadCloser, stdout io.Writer, args ...string) (err error)

'docker rmi NAME' removes all images with the name NAME

func (*Server) CmdRun

func (srv *Server) CmdRun(stdin io.ReadCloser, stdout io.Writer, args ...string) error

func (*Server) CmdStart

func (srv *Server) CmdStart(stdin io.ReadCloser, stdout io.Writer, args ...string) error

func (*Server) CmdStop

func (srv *Server) CmdStop(stdin io.ReadCloser, stdout io.Writer, args ...string) error

func (*Server) CmdTag

func (srv *Server) CmdTag(stdin io.ReadCloser, stdout io.Writer, args ...string) error

func (*Server) CmdVersion

func (srv *Server) CmdVersion(stdin io.ReadCloser, stdout io.Writer, args ...string) error

'docker version': show version information

func (*Server) CmdWait

func (srv *Server) CmdWait(stdin io.ReadCloser, stdout io.Writer, args ...string) error

'docker wait': block until a container stops

func (*Server) Help

func (srv *Server) Help() string

FIXME: Stop violating DRY by repeating usage here and in Subcmd declarations

func (*Server) Name

func (srv *Server) Name() string

type State

type State struct {
	Running   bool
	Pid       int
	ExitCode  int
	StartedAt time.Time
	// contains filtered or unexported fields
}

func (*State) String

func (s *State) String() string

String returns a human-readable description of the state

type TagStore

type TagStore struct {
	Repositories map[string]Repository
	// contains filtered or unexported fields
}

func NewTagStore

func NewTagStore(path string, graph *Graph) (*TagStore, error)

func (*TagStore) ById

func (store *TagStore) ById() map[string][]string

Return a reverse-lookup table of all the names which refer to each image Eg. {"43b5f19b10584": {"base:latest", "base:v1"}}

func (*TagStore) Get

func (store *TagStore) Get(repoName string) (Repository, error)

func (*TagStore) GetImage

func (store *TagStore) GetImage(repoName, tag string) (*Image, error)

func (*TagStore) ImageName

func (store *TagStore) ImageName(id string) string

func (*TagStore) LookupImage

func (store *TagStore) LookupImage(name string) (*Image, error)

func (*TagStore) Reload

func (store *TagStore) Reload() error

func (*TagStore) Save

func (store *TagStore) Save() error

func (*TagStore) Set

func (store *TagStore) Set(repoName, tag, imageName string, force bool) error

Directories

Path Synopsis

Jump to

Keyboard shortcuts

? : This menu
/ : Search site
f or F : Jump to
y or Y : Canonical URL