gcplogging_linux.go 1.1 KB

1234567891011121314151617181920212223242526272829
  1. package gcplogs
  2. import (
  3. "os"
  4. "github.com/docker/docker/dockerversion"
  5. "github.com/docker/docker/pkg/homedir"
  6. "github.com/sirupsen/logrus"
  7. )
  8. // ensureHomeIfIAmStatic ensure $HOME to be set if dockerversion.IAmStatic is "true".
  9. // See issue #29344: gcplogs segfaults (static binary)
  10. // If HOME is not set, logging.NewClient() will call os/user.Current() via oauth2/google.
  11. // However, in static binary, os/user.Current() leads to segfault due to a glibc issue that won't be fixed
  12. // in a short term. (golang/go#13470, https://sourceware.org/bugzilla/show_bug.cgi?id=19341)
  13. // So we forcibly set HOME so as to avoid call to os/user/Current()
  14. func ensureHomeIfIAmStatic() error {
  15. // Note: dockerversion.IAmStatic and homedir.GetStatic() is only available for linux.
  16. // So we need to use them in this gcplogging_linux.go rather than in gcplogging.go
  17. if dockerversion.IAmStatic == "true" && os.Getenv("HOME") == "" {
  18. home, err := homedir.GetStatic()
  19. if err != nil {
  20. return err
  21. }
  22. logrus.Warnf("gcplogs requires HOME to be set for static daemon binary. Forcibly setting HOME to %s.", home)
  23. os.Setenv("HOME", home)
  24. }
  25. return nil
  26. }