code: func BindMount(mnt fs.MountUnmounter, source, destination string, readOnly bool) error {
  	absSource, err := filepath.EvalSymlinks(source)
  	if err != nil {
  		return errwrap.Wrap(fmt.Errorf("Could not resolve symlink for source %v", source), err)
  	}
  
  	if err := EnsureTargetExists(absSource, destination); err != nil {
  		return errwrap.Wrap(fmt.Errorf("Could not create destination mount point: %v", destination), err)
  	} else if err := mnt.Mount(absSource, destination, "bind", syscall.MS_BIND, ""); err != nil {
  		return errwrap.Wrap(fmt.Errorf("Could not bind mount %v to %v", absSource, destination), err)
  	}
  	if readOnly {
  		err := mnt.Mount(source, destination, "bind", syscall.MS_REMOUNT|syscall.MS_RDONLY|syscall.MS_BIND, "")
  
  		// If we failed to remount ro, unmount
  		if err != nil {
  			mnt.Unmount(destination, 0) // if this fails, oh well
  			return errwrap.Wrap(fmt.Errorf("Could not remount %v read-only", destination), err)
  		}
  	}
  	return nil
  }
docs: // BindMount, well, bind mounts a source in to a destination. This will
  // do some bookkeeping:
  // * evaluate all symlinks
  // * ensure the source exists
  // * recursively create the destination