示例#1
0
文件: docker.go 项目: zanhsieh/pipes
func (d Docker) Run(cont *engine.Container) (err error) {
	contPorts := map[dockerclient.Port]struct{}{}
	hostPorts := map[dockerclient.Port][]dockerclient.PortBinding{}
	for _, m := range cont.Ports {
		for k, v := range m {
			var port dockerclient.Port
			port = dockerclient.Port(fmt.Sprintf("%s/tcp", k))
			contPorts[port] = struct{}{}
			hostPorts[port] = []dockerclient.PortBinding{
				dockerclient.PortBinding{HostIP: "", HostPort: v},
			}
		}
	}
	opts := dockerclient.CreateContainerOptions{
		Name: cont.Name,
		Config: &dockerclient.Config{
			Image:        cont.Image.Name,
			Hostname:     cont.Hostname,
			Cmd:          cont.Cmd,
			Tty:          cont.Tty,
			ExposedPorts: contPorts,
			Env:          cont.Env,
		},
	}
	hostConfig := &dockerclient.HostConfig{
		NetworkMode:  cont.NetworkMode,
		PortBindings: hostPorts,
	}
	log.Debugln("Create container:", cont.Name)
	c, err := d.client.CreateContainer(opts)
	if err != nil {
		return
	}
	err = d.client.StartContainer(c.ID, hostConfig)
	if err != nil {
		return
	}
	c, err = d.client.InspectContainer(c.ID)
	if err != nil {
		return
	}
	cont.Id = c.ID

	// Saving network informations
	if c.NetworkSettings == nil {
		return errors.New("Failed to get container network settings")
	}
	cont.Gateway = c.NetworkSettings.Gateway
	for port, bindings := range c.NetworkSettings.Ports {
		contPort := strings.TrimSuffix(string(port), "/tcp")
		for _, elem := range cont.Ports {
			hostPort, prs := elem[contPort]
			if prs {
				if hostPort != bindings[0].HostPort {
					elem[contPort] = bindings[0].HostPort
				}
				break
			}
		}
	}
	// Swarm extras
	if c.Node != nil {
		cont.IP = c.Node.IP
	}
	log.Debugln("Container:", cont)

	log.Infoln("Run:", cont.Name)
	return
}