| package daemon // import "github.com/docker/docker/daemon" |
| |
| import ( |
| "os" |
| "path/filepath" |
| |
| "github.com/docker/docker/pkg/ioutils" |
| "github.com/google/uuid" |
| "github.com/pkg/errors" |
| ) |
| |
| const idFilename = "engine-id" |
| |
| // LoadOrCreateID loads the engine's ID from the given root, or generates a new ID |
| // if it doesn't exist. It returns the ID, and any error that occurred when |
| // saving the file. |
| // |
| // Note that this function expects the daemon's root directory to already have |
| // been created with the right permissions and ownership (usually this would |
| // be done by daemon.CreateDaemonRoot(). |
| func LoadOrCreateID(root string) (string, error) { |
| var id string |
| idPath := filepath.Join(root, idFilename) |
| idb, err := os.ReadFile(idPath) |
| if os.IsNotExist(err) { |
| id = uuid.New().String() |
| if err := ioutils.AtomicWriteFile(idPath, []byte(id), os.FileMode(0o600)); err != nil { |
| return "", errors.Wrap(err, "error saving ID file") |
| } |
| } else if err != nil { |
| return "", errors.Wrapf(err, "error loading ID file %s", idPath) |
| } else { |
| id = string(idb) |
| } |
| return id, nil |
| } |