package utils import ( "io" "os" "path/filepath" ) // CopyPath copies a file or directory from src to dest func CopyPath(src, dest string) error { info, err := os.Stat(src) if err != nil { return err } if info.IsDir() { return copyDir(src, dest) } return CopyFile(src, dest) } // CopyFile copies a single file from src to dest func CopyFile(src, dest string) error { srcFile, err := os.Open(src) if err != nil { return err } defer srcFile.Close() if err := os.MkdirAll(filepath.Dir(dest), 0755); err != nil { return err } destFile, err := os.Create(dest) if err != nil { return err } defer destFile.Close() if _, err := io.Copy(destFile, srcFile); err != nil { return err } info, err := os.Stat(src) if err == nil { os.Chmod(dest, info.Mode()) } return nil } func copyDir(src, dest string) error { info, err := os.Stat(src) if err != nil { return err } if err := os.MkdirAll(dest, info.Mode()); err != nil { return err } entries, err := os.ReadDir(src) if err != nil { return err } for _, entry := range entries { srcPath := filepath.Join(src, entry.Name()) destPath := filepath.Join(dest, entry.Name()) if err := CopyPath(srcPath, destPath); err != nil { return err } } return nil } // IsInDocker 判断程序是否运行在 Docker 容器中 func IsInDocker() bool { if _, err := os.Stat("/.dockerenv"); err == nil { return true } return false }