The container-related types and structures of the circuit API are in a dedicated package:
import "github.com/gocircuit/circuit/client/docker"
Container element manipulations and semantics are exactly analogous to their process element counterparts.
Given an anchor object, new containers are created using the anchor method:
MakeDocker(docker.Run) (docker.Container, error)
The docker.Run
argument above is analogous to the Cmd
argument in the MakeProc
method.
It specifies the execution parameters of the container, and is defined as:
type Run struct { Image string Memory int64 CpuShares int64 Lxc []string Volume []string Dir string Entry string Env []string Path string Args []string Scrub bool }
Excluding the field Scrub
, all fields exactly match the standard
Docker execution parameters which are explained in Docker's help:
docker help run
The field Scrub
is also analogous to its counterpart in the process execution structure Cmd
.
If Scrub
is set, the container element will automatically be detached from the anchor and discarded,
as soon as the underlying Docker container exits.
If Scrub
is not set, the container element will remain attached to the anchor even after the underlying
Docker container dies.
The methods of the container element interface are otherwise identical in form and meaning as those of the process element:
type Container interface { Scrub() Peek() (*docker.Stat, error) Signal(sig string) error Wait() (*docker.Stat, error) Stdin() io.WriteCloser Stdout() io.ReadCloser Stderr() io.ReadCloser }
Finally, the docker.Stat
structure (not shown here for space considerations)
exactly captures all the container status variables that are available through the docker inspect
command.
The following snippet shows an example of creating a Docker container with an Ubuntu image,
which runs the ls
command inside, while also specifying some resource limits and
mapping some file system volumes:
proc, err := anchor.MakeDocker( docker.Run{ Image: "ubuntu", Memory: 1000000000, CpuShares: 3, Volume: []string{"/webapp", "/src/webapp:/opt/webapp:ro"}, Dir: "/", Path: "/bin/ls", Args: []string{"/"}, Scrub: true, })