id.go 837 B

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950
  1. package docker
  2. import (
  3. "bufio"
  4. "bytes"
  5. "errors"
  6. "os"
  7. )
  8. var (
  9. _dockerId string
  10. dockerFeature = []byte("docker/")
  11. errNotMatch = errors.New("not match")
  12. )
  13. func SelfContainerID() (did string, err error) {
  14. if _dockerId != "" {
  15. return _dockerId, nil
  16. }
  17. var (
  18. pos int
  19. p []byte
  20. fp *os.File
  21. )
  22. if fp, err = os.Open("/proc/self/cgroup"); err != nil {
  23. return
  24. }
  25. defer func() {
  26. _ = fp.Close()
  27. }()
  28. br := bufio.NewReader(fp)
  29. for {
  30. if p, _, err = br.ReadLine(); err != nil {
  31. break
  32. }
  33. if pos = bytes.Index(p, dockerFeature); pos == -1 {
  34. continue
  35. }
  36. p = bytes.TrimSpace(p[pos+len(dockerFeature):])
  37. if pos = bytes.LastIndexByte(p, '/'); pos == -1 {
  38. _dockerId = string(p)
  39. return _dockerId, nil
  40. } else {
  41. _dockerId = string(p[pos+1:])
  42. return _dockerId, nil
  43. }
  44. }
  45. return "", errNotMatch
  46. }