func (graph *Graph) restore() error { dir, err := ioutil.ReadDir(graph.Root) if err != nil { return err } var ids = []string{} for _, v := range dir { id := v.Name() if graph.driver.Exists(id) { ids = append(ids, id) } } graph.idIndex = utils.NewTruncIndex(ids) utils.Debugf("Restored %d elements", len(dir)) return nil }
// NewGraph instantiates a new graph at the given root path in the filesystem. // `root` will be created if it doesn't exist. func NewGraph(root string) (*Graph, error) { abspath, err := filepath.Abs(root) if err != nil { return nil, err } // Create the root directory if it doesn't exists if err := os.MkdirAll(root, 0700); err != nil && !os.IsExist(err) { return nil, err } graph := &Graph{ Root: abspath, idIndex: utils.NewTruncIndex(), } if err := graph.restore(); err != nil { return nil, err } return graph, nil }
func NewRuntimeFromDirectory(root string, autoRestart bool) (*Runtime, error) { runtimeRepo := path.Join(root, "containers") if err := os.MkdirAll(runtimeRepo, 0700); err != nil && !os.IsExist(err) { return nil, err } g, err := NewGraph(path.Join(root, "graph")) if err != nil { return nil, err } volumes, err := NewGraph(path.Join(root, "volumes")) if err != nil { return nil, err } repositories, err := NewTagStore(path.Join(root, "repositories"), g) if err != nil { return nil, fmt.Errorf("Couldn't create Tag store: %s", err) } if NetworkBridgeIface == "" { NetworkBridgeIface = DefaultNetworkBridge } netManager, err := newNetworkManager(NetworkBridgeIface) if err != nil { return nil, err } runtime := &Runtime{ root: root, repository: runtimeRepo, containers: list.New(), networkManager: netManager, graph: g, repositories: repositories, idIndex: utils.NewTruncIndex(), capabilities: &Capabilities{}, autoRestart: autoRestart, volumes: volumes, } if err := runtime.restore(); err != nil { return nil, err } return runtime, nil }
// NewGraph instantiates a new graph at the given root path in the filesystem. // `root` will be created if it doesn't exist. func NewGraph(root string) (*Graph, error) { abspath, err := filepath.Abs(root) if err != nil { return nil, err } // Create the root directory if it doesn't exists if err := os.MkdirAll(root, 0700); err != nil && !os.IsExist(err) { return nil, err } graph := &Graph{ Root: abspath, idIndex: utils.NewTruncIndex(), checksumLock: make(map[string]*sync.Mutex), lockSumFile: &sync.Mutex{}, lockSumMap: &sync.Mutex{}, } if err := graph.restore(); err != nil { return nil, err } return graph, nil }
func NewRuntimeFromDirectory(config *DaemonConfig) (*Runtime, error) { runtimeRepo := path.Join(config.GraphPath, "containers") if err := os.MkdirAll(runtimeRepo, 0700); err != nil && !os.IsExist(err) { return nil, err } g, err := NewGraph(path.Join(config.GraphPath, "graph")) if err != nil { return nil, err } volumes, err := NewGraph(path.Join(config.GraphPath, "volumes")) if err != nil { return nil, err } repositories, err := NewTagStore(path.Join(config.GraphPath, "repositories"), g) if err != nil { return nil, fmt.Errorf("Couldn't create Tag store: %s", err) } if config.BridgeIface == "" { config.BridgeIface = DefaultNetworkBridge } netManager, err := newNetworkManager(config) if err != nil { return nil, err } gographPath := path.Join(config.GraphPath, "linkgraph.db") initDatabase := false if _, err := os.Stat(gographPath); err != nil { if os.IsNotExist(err) { initDatabase = true } else { return nil, err } } conn, err := sql.Open("sqlite3", gographPath) if err != nil { return nil, err } graph, err := gograph.NewDatabase(conn, initDatabase) if err != nil { return nil, err } runtime := &Runtime{ repository: runtimeRepo, containers: list.New(), networkManager: netManager, graph: g, repositories: repositories, idIndex: utils.NewTruncIndex(), capabilities: &Capabilities{}, volumes: volumes, config: config, containerGraph: graph, } if err := runtime.restore(); err != nil { return nil, err } return runtime, nil }
func NewRuntimeFromDirectory(config *DaemonConfig, eng *engine.Engine) (*Runtime, error) { // Set the default driver graphdriver.DefaultDriver = config.GraphDriver // Load storage driver driver, err := graphdriver.New(config.Root) if err != nil { return nil, err } utils.Debugf("Using graph driver %s", driver) runtimeRepo := path.Join(config.Root, "containers") if err := os.MkdirAll(runtimeRepo, 0700); err != nil && !os.IsExist(err) { return nil, err } if ad, ok := driver.(*aufs.Driver); ok { utils.Debugf("Migrating existing containers") if err := ad.Migrate(config.Root, setupInitLayer); err != nil { return nil, err } } utils.Debugf("Creating images graph") g, err := NewGraph(path.Join(config.Root, "graph"), driver) if err != nil { return nil, err } // We don't want to use a complex driver like aufs or devmapper // for volumes, just a plain filesystem volumesDriver, err := graphdriver.GetDriver("vfs", config.Root) if err != nil { return nil, err } utils.Debugf("Creating volumes graph") volumes, err := NewGraph(path.Join(config.Root, "volumes"), volumesDriver) if err != nil { return nil, err } utils.Debugf("Creating repository list") repositories, err := NewTagStore(path.Join(config.Root, "repositories-"+driver.String()), g) if err != nil { return nil, fmt.Errorf("Couldn't create Tag store: %s", err) } if !config.DisableNetwork { job := eng.Job("init_networkdriver") job.SetenvBool("EnableIptables", config.EnableIptables) job.SetenvBool("InterContainerCommunication", config.InterContainerCommunication) job.SetenvBool("EnableIpForward", config.EnableIpForward) job.Setenv("BridgeIface", config.BridgeIface) job.Setenv("BridgeIP", config.BridgeIP) job.Setenv("DefaultBindingIP", config.DefaultIp.String()) if err := job.Run(); err != nil { return nil, err } } graphdbPath := path.Join(config.Root, "linkgraph.db") graph, err := graphdb.NewSqliteConn(graphdbPath) if err != nil { return nil, err } localCopy := path.Join(config.Root, "init", fmt.Sprintf("dockerinit-%s", dockerversion.VERSION)) sysInitPath := utils.DockerInitPath(localCopy) if sysInitPath == "" { return nil, fmt.Errorf("Could not locate dockerinit: This usually means docker was built incorrectly. See http://docs.docker.io/en/latest/contributing/devenvironment for official build instructions.") } if sysInitPath != localCopy { // When we find a suitable dockerinit binary (even if it's our local binary), we copy it into config.Root at localCopy for future use (so that the original can go away without that being a problem, for example during a package upgrade). if err := os.Mkdir(path.Dir(localCopy), 0700); err != nil && !os.IsExist(err) { return nil, err } if _, err := utils.CopyFile(sysInitPath, localCopy); err != nil { return nil, err } if err := os.Chmod(localCopy, 0700); err != nil { return nil, err } sysInitPath = localCopy } var ( ed execdriver.Driver sysInfo = sysinfo.New(false) ) switch config.ExecDriver { case "lxc": // we want to five the lxc driver the full docker root because it needs // to access and write config and template files in /var/lib/docker/containers/* // to be backwards compatible ed, err = lxc.NewDriver(config.Root, sysInfo.AppArmor) case "native": ed, err = native.NewDriver(path.Join(config.Root, "execdriver", "native")) default: return nil, fmt.Errorf("unknown exec driver %s", config.ExecDriver) } if err != nil { return nil, err } runtime := &Runtime{ repository: runtimeRepo, containers: list.New(), graph: g, repositories: repositories, idIndex: utils.NewTruncIndex(), sysInfo: sysInfo, volumes: volumes, config: config, containerGraph: graph, driver: driver, sysInitPath: sysInitPath, execDriver: ed, eng: eng, } if err := runtime.restore(); err != nil { return nil, err } return runtime, nil }
func NewDaemonFromDirectory(config *daemonconfig.Config, eng *engine.Engine) (*Daemon, error) { if !config.EnableSelinuxSupport { selinux.SetDisabled() } // Create the root directory if it doesn't exists if err := os.MkdirAll(config.Root, 0700); err != nil && !os.IsExist(err) { return nil, err } // Set the default driver graphdriver.DefaultDriver = config.GraphDriver // Load storage driver driver, err := graphdriver.New(config.Root) if err != nil { return nil, err } utils.Debugf("Using graph driver %s", driver) if err := remountPrivate(config.Root); err != nil { return nil, err } daemonRepo := path.Join(config.Root, "containers") if err := os.MkdirAll(daemonRepo, 0700); err != nil && !os.IsExist(err) { return nil, err } // Migrate the container if it is aufs and aufs is enabled if err = migrateIfAufs(driver, config.Root); err != nil { return nil, err } utils.Debugf("Creating images graph") g, err := graph.NewGraph(path.Join(config.Root, "graph"), driver) if err != nil { return nil, err } // We don't want to use a complex driver like aufs or devmapper // for volumes, just a plain filesystem volumesDriver, err := graphdriver.GetDriver("vfs", config.Root) if err != nil { return nil, err } utils.Debugf("Creating volumes graph") volumes, err := graph.NewGraph(path.Join(config.Root, "volumes"), volumesDriver) if err != nil { return nil, err } utils.Debugf("Creating repository list") repositories, err := graph.NewTagStore(path.Join(config.Root, "repositories-"+driver.String()), g) if err != nil { return nil, fmt.Errorf("Couldn't create Tag store: %s", err) } if !config.DisableNetwork { job := eng.Job("init_networkdriver") job.SetenvBool("EnableIptables", config.EnableIptables) job.SetenvBool("InterContainerCommunication", config.InterContainerCommunication) job.SetenvBool("EnableIpForward", config.EnableIpForward) job.Setenv("BridgeIface", config.BridgeIface) job.Setenv("BridgeIP", config.BridgeIP) job.Setenv("DefaultBindingIP", config.DefaultIp.String()) if err := job.Run(); err != nil { return nil, err } } graphdbPath := path.Join(config.Root, "linkgraph.db") graph, err := graphdb.NewSqliteConn(graphdbPath) if err != nil { return nil, err } localCopy := path.Join(config.Root, "init", fmt.Sprintf("dockerinit-%s", dockerversion.VERSION)) sysInitPath := utils.DockerInitPath(localCopy) if sysInitPath == "" { return nil, fmt.Errorf("Could not locate dockerinit: This usually means docker was built incorrectly. See http://docs.docker.io/en/latest/contributing/devenvironment for official build instructions.") } if sysInitPath != localCopy { // When we find a suitable dockerinit binary (even if it's our local binary), we copy it into config.Root at localCopy for future use (so that the original can go away without that being a problem, for example during a package upgrade). if err := os.Mkdir(path.Dir(localCopy), 0700); err != nil && !os.IsExist(err) { return nil, err } if _, err := utils.CopyFile(sysInitPath, localCopy); err != nil { return nil, err } if err := os.Chmod(localCopy, 0700); err != nil { return nil, err } sysInitPath = localCopy } sysInfo := sysinfo.New(false) ed, err := execdrivers.NewDriver(config.ExecDriver, config.Root, sysInitPath, sysInfo) if err != nil { return nil, err } daemon := &Daemon{ repository: daemonRepo, containers: list.New(), graph: g, repositories: repositories, idIndex: utils.NewTruncIndex([]string{}), sysInfo: sysInfo, volumes: volumes, config: config, containerGraph: graph, driver: driver, sysInitPath: sysInitPath, execDriver: ed, eng: eng, } if err := daemon.checkLocaldns(); err != nil { return nil, err } if err := daemon.restore(); err != nil { return nil, err } return daemon, nil }
func NewRuntimeFromDirectory(config *DaemonConfig) (*Runtime, error) { // Set the default driver graphdriver.DefaultDriver = config.GraphDriver // Load storage driver driver, err := graphdriver.New(config.Root) if err != nil { return nil, err } utils.Debugf("Using graph driver %s", driver) runtimeRepo := path.Join(config.Root, "containers") if err := os.MkdirAll(runtimeRepo, 0700); err != nil && !os.IsExist(err) { return nil, err } if ad, ok := driver.(*aufs.Driver); ok { if err := ad.Migrate(config.Root, setupInitLayer); err != nil { return nil, err } } if err := linkLxcStart(config.Root); err != nil { return nil, err } g, err := NewGraph(path.Join(config.Root, "graph"), driver) if err != nil { return nil, err } // We don't want to use a complex driver like aufs or devmapper // for volumes, just a plain filesystem volumesDriver, err := graphdriver.GetDriver("vfs", config.Root) if err != nil { return nil, err } volumes, err := NewGraph(path.Join(config.Root, "volumes"), volumesDriver) if err != nil { return nil, err } repositories, err := NewTagStore(path.Join(config.Root, "repositories-"+driver.String()), g) if err != nil { return nil, fmt.Errorf("Couldn't create Tag store: %s", err) } if config.BridgeIface == "" { config.BridgeIface = DefaultNetworkBridge } netManager, err := newNetworkManager(config) if err != nil { return nil, err } graphdbPath := path.Join(config.Root, "linkgraph.db") initDatabase := false if _, err := os.Stat(graphdbPath); err != nil { if os.IsNotExist(err) { initDatabase = true } else { return nil, err } } conn, err := sql.Open("sqlite3", graphdbPath) if err != nil { return nil, err } graph, err := graphdb.NewDatabase(conn, initDatabase) if err != nil { return nil, err } localCopy := path.Join(config.Root, "init", fmt.Sprintf("dockerinit-%s", VERSION)) sysInitPath := utils.DockerInitPath(localCopy) if sysInitPath == "" { return nil, fmt.Errorf("Could not locate dockerinit: This usually means docker was built incorrectly. See http://docs.docker.io/en/latest/contributing/devenvironment for official build instructions.") } if !utils.IAMSTATIC { if err := os.Mkdir(path.Join(config.Root, fmt.Sprintf("init")), 0700); err != nil && !os.IsExist(err) { return nil, err } if _, err := utils.CopyFile(sysInitPath, localCopy); err != nil { return nil, err } sysInitPath = localCopy if err := os.Chmod(sysInitPath, 0700); err != nil { return nil, err } } runtime := &Runtime{ repository: runtimeRepo, containers: list.New(), networkManager: netManager, graph: g, repositories: repositories, idIndex: utils.NewTruncIndex(), capabilities: &Capabilities{}, volumes: volumes, config: config, containerGraph: graph, driver: driver, sysInitPath: sysInitPath, } if err := runtime.restore(); err != nil { return nil, err } return runtime, nil }
func NewRuntimeFromDirectory(config *DaemonConfig) (*Runtime, error) { // Set the default driver graphdriver.DefaultDriver = config.GraphDriver // Load storage driver driver, err := graphdriver.New(config.Root) if err != nil { return nil, err } utils.Debugf("Using graph driver %s", driver) runtimeRepo := path.Join(config.Root, "containers") if err := os.MkdirAll(runtimeRepo, 0700); err != nil && !os.IsExist(err) { return nil, err } if ad, ok := driver.(*aufs.Driver); ok { utils.Debugf("Migrating existing containers") if err := ad.Migrate(config.Root, setupInitLayer); err != nil { return nil, err } } utils.Debugf("Escaping AppArmor confinement") if err := linkLxcStart(config.Root); err != nil { return nil, err } utils.Debugf("Creating images graph") g, err := NewGraph(path.Join(config.Root, "graph"), driver) if err != nil { return nil, err } // We don't want to use a complex driver like aufs or devmapper // for volumes, just a plain filesystem volumesDriver, err := graphdriver.GetDriver("vfs", config.Root) if err != nil { return nil, err } utils.Debugf("Creating volumes graph") volumes, err := NewGraph(path.Join(config.Root, "volumes"), volumesDriver) if err != nil { return nil, err } utils.Debugf("Creating repository list") repositories, err := NewTagStore(path.Join(config.Root, "repositories-"+driver.String()), g) if err != nil { return nil, fmt.Errorf("Couldn't create Tag store: %s", err) } if config.BridgeIface == "" { config.BridgeIface = DefaultNetworkBridge } netManager, err := newNetworkManager(config) if err != nil { return nil, err } graphdbPath := path.Join(config.Root, "linkgraph.db") graph, err := graphdb.NewSqliteConn(graphdbPath) if err != nil { return nil, err } localCopy := path.Join(config.Root, "init", fmt.Sprintf("dockerinit-%s", VERSION)) sysInitPath := utils.DockerInitPath(localCopy) if sysInitPath == "" { return nil, fmt.Errorf("Could not locate dockerinit: This usually means docker was built incorrectly. See http://docs.docker.io/en/latest/contributing/devenvironment for official build instructions.") } if sysInitPath != localCopy { // When we find a suitable dockerinit binary (even if it's our local binary), we copy it into config.Root at localCopy for future use (so that the original can go away without that being a problem, for example during a package upgrade). if err := os.Mkdir(path.Dir(localCopy), 0700); err != nil && !os.IsExist(err) { return nil, err } if _, err := utils.CopyFile(sysInitPath, localCopy); err != nil { return nil, err } if err := os.Chmod(localCopy, 0700); err != nil { return nil, err } sysInitPath = localCopy } runtime := &Runtime{ repository: runtimeRepo, containers: list.New(), networkManager: netManager, graph: g, repositories: repositories, idIndex: utils.NewTruncIndex(), capabilities: &Capabilities{}, volumes: volumes, config: config, containerGraph: graph, driver: driver, sysInitPath: sysInitPath, } if err := runtime.restore(); err != nil { return nil, err } return runtime, nil }