docker.go 2.5 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112
  1. package docker
  2. import (
  3. "container/list"
  4. "fmt"
  5. "io/ioutil"
  6. "os"
  7. "path"
  8. )
  9. type Docker struct {
  10. root string
  11. repository string
  12. containers *list.List
  13. }
  14. func (docker *Docker) List() []*Container {
  15. containers := []*Container{}
  16. for e := docker.containers.Front(); e != nil; e = e.Next() {
  17. containers = append(containers, e.Value.(*Container))
  18. }
  19. return containers
  20. }
  21. func (docker *Docker) getContainerElement(name string) *list.Element {
  22. for e := docker.containers.Front(); e != nil; e = e.Next() {
  23. container := e.Value.(*Container)
  24. if container.Name == name {
  25. return e
  26. }
  27. }
  28. return nil
  29. }
  30. func (docker *Docker) Get(name string) *Container {
  31. e := docker.getContainerElement(name)
  32. if e == nil {
  33. return nil
  34. }
  35. return e.Value.(*Container)
  36. }
  37. func (docker *Docker) Exists(name string) bool {
  38. return docker.Get(name) != nil
  39. }
  40. func (docker *Docker) Create(name string, command string, args []string, layers []string, config *Config) (*Container, error) {
  41. if docker.Exists(name) {
  42. return nil, fmt.Errorf("Container %v already exists", name)
  43. }
  44. root := path.Join(docker.repository, name)
  45. container, err := createContainer(name, root, command, args, layers, config)
  46. if err != nil {
  47. return nil, err
  48. }
  49. docker.containers.PushBack(container)
  50. return container, nil
  51. }
  52. func (docker *Docker) Destroy(container *Container) error {
  53. element := docker.getContainerElement(container.Name)
  54. if element == nil {
  55. return fmt.Errorf("Container %v not found - maybe it was already destroyed?", container.Name)
  56. }
  57. if err := container.Stop(); err != nil {
  58. return err
  59. }
  60. if err := os.RemoveAll(container.Root); err != nil {
  61. return err
  62. }
  63. docker.containers.Remove(element)
  64. return nil
  65. }
  66. func (docker *Docker) restore() error {
  67. dir, err := ioutil.ReadDir(docker.repository)
  68. if err != nil {
  69. return err
  70. }
  71. for _, v := range dir {
  72. container, err := loadContainer(path.Join(docker.repository, v.Name()))
  73. if err != nil {
  74. fmt.Errorf("Failed to load %v: %v", v.Name(), err)
  75. continue
  76. }
  77. docker.containers.PushBack(container)
  78. }
  79. return nil
  80. }
  81. func New() (*Docker, error) {
  82. return NewFromDirectory("/var/lib/docker")
  83. }
  84. func NewFromDirectory(root string) (*Docker, error) {
  85. docker := &Docker{
  86. root: root,
  87. repository: path.Join(root, "containers"),
  88. containers: list.New(),
  89. }
  90. if err := os.Mkdir(docker.repository, 0700); err != nil && !os.IsExist(err) {
  91. return nil, err
  92. }
  93. if err := docker.restore(); err != nil {
  94. return nil, err
  95. }
  96. return docker, nil
  97. }