func (srv *Server) ContainerStart(job *engine.Job) string { if len(job.Args) < 1 { return fmt.Sprintf("Usage: %s container_id", job.Name) } name := job.Args[0] runtime := srv.runtime container := runtime.Get(name) if container == nil { return fmt.Sprintf("No such container: %s", name) } // If no environment was set, then no hostconfig was passed. if len(job.Environ()) > 0 { var hostConfig HostConfig if err := job.ExportEnv(&hostConfig); err != nil { return err.Error() } // Validate the HostConfig binds. Make sure that: // 1) the source of a bind mount isn't / // The bind mount "/:/foo" isn't allowed. // 2) Check that the source exists // The source to be bind mounted must exist. for _, bind := range hostConfig.Binds { splitBind := strings.Split(bind, ":") source := splitBind[0] // refuse to bind mount "/" to the container if source == "/" { return fmt.Sprintf("Invalid bind mount '%s' : source can't be '/'", bind) } // ensure the source exists on the host _, err := os.Stat(source) if err != nil && os.IsNotExist(err) { return fmt.Sprintf("Invalid bind mount '%s' : source doesn't exist", bind) } } // Register any links from the host config before starting the container // FIXME: we could just pass the container here, no need to lookup by name again. if err := srv.RegisterLinks(name, &hostConfig); err != nil { return err.Error() } container.hostConfig = &hostConfig container.ToDisk() } if err := container.Start(); err != nil { return fmt.Sprintf("Cannot start container %s: %s", name, err) } srv.LogEvent("start", container.ID, runtime.repositories.ImageName(container.Image)) return "0" }
func (srv *Server) ContainerCreate(job *engine.Job) string { var name string if len(job.Args) == 1 { name = job.Args[0] } else if len(job.Args) > 1 { return fmt.Sprintf("Usage: %s ", job.Name) } var config Config if err := job.ExportEnv(&config); err != nil { return err.Error() } if config.Memory != 0 && config.Memory < 524288 { return "Minimum memory limit allowed is 512k" } if config.Memory > 0 && !srv.runtime.capabilities.MemoryLimit { config.Memory = 0 } if config.Memory > 0 && !srv.runtime.capabilities.SwapLimit { config.MemorySwap = -1 } container, buildWarnings, err := srv.runtime.Create(&config, name) if err != nil { if srv.runtime.graph.IsNotExist(err) { _, tag := utils.ParseRepositoryTag(config.Image) if tag == "" { tag = DEFAULTTAG } return fmt.Sprintf("No such image: %s (tag: %s)", config.Image, tag) } return err.Error() } srv.LogEvent("create", container.ID, srv.runtime.repositories.ImageName(container.Image)) // FIXME: this is necessary because runtime.Create might return a nil container // with a non-nil error. This should not happen! Once it's fixed we // can remove this workaround. if container != nil { job.Printf("%s\n", container.ID) } for _, warning := range buildWarnings { job.Errorf("%s\n", warning) } return "0" }
func (srv *Server) ContainerCreate(job *engine.Job) string { var name string if len(job.Args) == 1 { name = job.Args[0] } else if len(job.Args) > 1 { return fmt.Sprintf("Usage: %s ", job.Name) } var config Config if err := job.ExportEnv(&config); err != nil { return err.Error() } if config.Memory != 0 && config.Memory < 524288 { return "Minimum memory limit allowed is 512k" } if config.Memory > 0 && !srv.runtime.capabilities.MemoryLimit { config.Memory = 0 } if config.Memory > 0 && !srv.runtime.capabilities.SwapLimit { config.MemorySwap = -1 } container, buildWarnings, err := srv.runtime.Create(&config, name) if err != nil { if srv.runtime.graph.IsNotExist(err) { _, tag := utils.ParseRepositoryTag(config.Image) if tag == "" { tag = DEFAULTTAG } return fmt.Sprintf("No such image: %s (tag: %s)", config.Image, tag) } return err.Error() } srv.LogEvent("create", container.ID, srv.runtime.repositories.ImageName(container.Image)) job.Printf("%s\n", container.ID) for _, warning := range buildWarnings { job.Errorf("%s\n", warning) } return "0" }