// RunDaemon creates the docker container, pulling images if necessary, starts // the container and returns the container information. It does not wait for // the container to exit. func RunDaemon(client dockerclient.Client, conf *dockerclient.ContainerConfig, name string) (*dockerclient.ContainerInfo, error) { // attempts to create the contianer id, err := client.CreateContainer(conf, name) if err != nil { // and pull the image and re-create if that fails err = client.PullImage(conf.Image, nil) if err != nil { return nil, err } id, err = client.CreateContainer(conf, name) if err != nil { client.RemoveContainer(id, true, true) return nil, err } } // fetches the container information info, err := client.InspectContainer(id) if err != nil { client.RemoveContainer(id, true, true) return nil, err } // starts the container err = client.StartContainer(id, &conf.HostConfig) if err != nil { client.RemoveContainer(id, true, true) return nil, err } return info, err }
// createContainer creates a new container using the specified options. Per the // docker API, the created container is not running and must be started // explicitly. func createContainer(client dockerclient.Client, config dockerclient.ContainerConfig) (*Container, error) { id, err := client.CreateContainer(&config, "") if err != nil { return nil, err } return &Container{ ID: id, containerInfo: dockerclient.ContainerInfo{Id: id}, client: client}, nil }
// Create a container func Create(docker dockerclient.Client, name string, image string) string { // Create a container containerConfig := &dockerclient.ContainerConfig{ Image: image, // Cmd: []string{"bash"}, AttachStdin: true, Tty: true} id, err := docker.CreateContainer(containerConfig, name) if err != nil { log.Fatal(err) } return id }
func Start(client dockerclient.Client, conf *dockerclient.ContainerConfig, auth *dockerclient.AuthConfig, pull bool) (*dockerclient.ContainerInfo, error) { // force-pull the image if specified. if pull { log.Printf("Pulling image %s", conf.Image) client.PullImage(conf.Image, auth) } // attempts to create the contianer id, err := client.CreateContainer(conf, "", auth) if err != nil { log.Printf("Pulling image %s", conf.Image) // and pull the image and re-create if that fails err = client.PullImage(conf.Image, auth) if err != nil { log.Errorf("Error pulling %s. %s\n", conf.Image, err) return nil, err } id, err = client.CreateContainer(conf, "", auth) if err != nil { log.Errorf("Error creating %s. %s\n", conf.Image, err) client.RemoveContainer(id, true, true) return nil, err } } // fetches the container information info, err := client.InspectContainer(id) if err != nil { log.Errorf("Error inspecting %s. %s\n", conf.Image, err) client.RemoveContainer(id, true, true) return nil, err } // starts the container err = client.StartContainer(id, &conf.HostConfig) if err != nil { log.Errorf("Error starting %s. %s\n", conf.Image, err) } return info, err }