start.go 1.3 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859
  1. package daemon
  2. import (
  3. "fmt"
  4. "github.com/docker/docker/runconfig"
  5. )
  6. func (daemon *Daemon) ContainerStart(name string, hostConfig *runconfig.HostConfig) error {
  7. container, err := daemon.Get(name)
  8. if err != nil {
  9. return err
  10. }
  11. if container.IsPaused() {
  12. return fmt.Errorf("Cannot start a paused container, try unpause instead.")
  13. }
  14. if container.IsRunning() {
  15. return fmt.Errorf("Container already started")
  16. }
  17. if _, err = daemon.verifyHostConfig(hostConfig); err != nil {
  18. return err
  19. }
  20. // This is kept for backward compatibility - hostconfig should be passed when
  21. // creating a container, not during start.
  22. if hostConfig != nil {
  23. if err := daemon.setHostConfig(container, hostConfig); err != nil {
  24. return err
  25. }
  26. }
  27. if err := container.Start(); err != nil {
  28. container.LogEvent("die")
  29. return fmt.Errorf("Cannot start container %s: %s", name, err)
  30. }
  31. return nil
  32. }
  33. func (daemon *Daemon) setHostConfig(container *Container, hostConfig *runconfig.HostConfig) error {
  34. container.Lock()
  35. defer container.Unlock()
  36. if err := parseSecurityOpt(container, hostConfig); err != nil {
  37. return err
  38. }
  39. // Register any links from the host config before starting the container
  40. if err := daemon.RegisterLinks(container, hostConfig); err != nil {
  41. return err
  42. }
  43. container.hostConfig = hostConfig
  44. container.toDisk()
  45. return nil
  46. }