mirror of https://github.com/containers/podman.git
				
				
				
			
		
			
				
	
	
		
			75 lines
		
	
	
		
			2.0 KiB
		
	
	
	
		
			Go
		
	
	
	
			
		
		
	
	
			75 lines
		
	
	
		
			2.0 KiB
		
	
	
	
		
			Go
		
	
	
	
| package docker
 | |
| 
 | |
| import (
 | |
| 	"io"
 | |
| 	"net/http"
 | |
| )
 | |
| 
 | |
| // AttachToContainerOptions is the set of options that can be used when
 | |
| // attaching to a container.
 | |
| //
 | |
| // See https://goo.gl/JF10Zk for more details.
 | |
| type AttachToContainerOptions struct {
 | |
| 	Container    string    `qs:"-"`
 | |
| 	InputStream  io.Reader `qs:"-"`
 | |
| 	OutputStream io.Writer `qs:"-"`
 | |
| 	ErrorStream  io.Writer `qs:"-"`
 | |
| 
 | |
| 	// If set, after a successful connect, a sentinel will be sent and then the
 | |
| 	// client will block on receive before continuing.
 | |
| 	//
 | |
| 	// It must be an unbuffered channel. Using a buffered channel can lead
 | |
| 	// to unexpected behavior.
 | |
| 	Success chan struct{}
 | |
| 
 | |
| 	// Override the key sequence for detaching a container.
 | |
| 	DetachKeys string
 | |
| 
 | |
| 	// Use raw terminal? Usually true when the container contains a TTY.
 | |
| 	RawTerminal bool `qs:"-"`
 | |
| 
 | |
| 	// Get container logs, sending it to OutputStream.
 | |
| 	Logs bool
 | |
| 
 | |
| 	// Stream the response?
 | |
| 	Stream bool
 | |
| 
 | |
| 	// Attach to stdin, and use InputStream.
 | |
| 	Stdin bool
 | |
| 
 | |
| 	// Attach to stdout, and use OutputStream.
 | |
| 	Stdout bool
 | |
| 
 | |
| 	// Attach to stderr, and use ErrorStream.
 | |
| 	Stderr bool
 | |
| }
 | |
| 
 | |
| // AttachToContainer attaches to a container, using the given options.
 | |
| //
 | |
| // See https://goo.gl/JF10Zk for more details.
 | |
| func (c *Client) AttachToContainer(opts AttachToContainerOptions) error {
 | |
| 	cw, err := c.AttachToContainerNonBlocking(opts)
 | |
| 	if err != nil {
 | |
| 		return err
 | |
| 	}
 | |
| 	return cw.Wait()
 | |
| }
 | |
| 
 | |
| // AttachToContainerNonBlocking attaches to a container, using the given options.
 | |
| // This function does not block.
 | |
| //
 | |
| // See https://goo.gl/NKpkFk for more details.
 | |
| func (c *Client) AttachToContainerNonBlocking(opts AttachToContainerOptions) (CloseWaiter, error) {
 | |
| 	if opts.Container == "" {
 | |
| 		return nil, &NoSuchContainer{ID: opts.Container}
 | |
| 	}
 | |
| 	path := "/containers/" + opts.Container + "/attach?" + queryString(opts)
 | |
| 	return c.hijack(http.MethodPost, path, hijackOptions{
 | |
| 		success:        opts.Success,
 | |
| 		setRawTerminal: opts.RawTerminal,
 | |
| 		in:             opts.InputStream,
 | |
| 		stdout:         opts.OutputStream,
 | |
| 		stderr:         opts.ErrorStream,
 | |
| 	})
 | |
| }
 |