func (d *DockerProxy) RunByConfig(runConfig ContainerRunConfig) (string, error) { portBingds := map[string][]dockerclient.PortBinding{} exposedPorts := map[string]struct{}{} for _, port := range runConfig.PortBindings { pb := dockerclient.PortBinding{} pb.HostIp = "0.0.0.0" pb.HostPort = fmt.Sprintf("%d", port.GetHostPort()) key := fmt.Sprintf("%d/%s", port.ContainerPort, port.Protocal) portBingds[key] = []dockerclient.PortBinding{pb} exposedPorts[key] = struct{}{} } config := &dockerclient.ContainerConfig{} config.Image = runConfig.Image config.Env = runConfig.Envs config.Cmd = runConfig.Cmds config.Hostname = runConfig.Hostname config.ExposedPorts = exposedPorts hostConfig := &dockerclient.HostConfig{} hostConfig.PortBindings = portBingds hostConfig.Binds = runConfig.Bindings hostConfig.Dns = runConfig.DNS hostConfig.RestartPolicy = dockerclient.RestartPolicy{ Name: runConfig.RestartPolicy.Name, MaximumRetryCount: int64(runConfig.RestartPolicy.MaxTry), } config.HostConfig = *hostConfig cid, err := d.CreateContainer(config, runConfig.Name) if err != nil { return "", errors.New(fmt.Sprintf("Failed to create a container. name: %s, error: %s", runConfig.Name, err.Error())) } fmt.Printf("Container created. name:%s, id:%s\n", runConfig.Name, cid) if err := d.StartContainer(cid, hostConfig); err != nil { fmt.Printf("Failed to start container. name:%s, id:%s.\n", runConfig.Name, cid) return cid, err } fmt.Printf("Container start successfully. name:%s, id:%s.\n", runConfig.Name, cid) return cid, nil }