code: func (c *ContainerIO) Pipe() {
  	wg := c.closer.wg
  	wg.Add(1)
  	go func() {
  		if _, err := io.Copy(c.stdoutGroup, c.stdout); err != nil {
  			logrus.WithError(err).Errorf("Failed to pipe stdout of container %q", c.id)
  		}
  		c.stdout.Close()
  		c.stdoutGroup.Close()
  		wg.Done()
  		logrus.Infof("Finish piping stdout of container %q", c.id)
  	}()
  
  	if !c.fifos.Terminal {
  		wg.Add(1)
  		go func() {
  			if _, err := io.Copy(c.stderrGroup, c.stderr); err != nil {
  				logrus.WithError(err).Errorf("Failed to pipe stderr of container %q", c.id)
  			}
  			c.stderr.Close()
  			c.stderrGroup.Close()
  			wg.Done()
  			logrus.Infof("Finish piping stderr of container %q", c.id)
  		}()
  	}
  }
docs: // Pipe creates container fifos and pipe container output
  // to output stream.