mirror of
https://github.com/containers/podman.git
synced 2025-08-06 11:32:07 +08:00
Merge pull request #970 from giuseppe/fix-start-attach
libpod: fix race with attach/start
This commit is contained in:
@ -178,18 +178,12 @@ func (c *Container) StartAndAttach(ctx context.Context, streams *AttachStreams,
|
||||
|
||||
// Attach to the container before starting it
|
||||
go func() {
|
||||
if err := c.attach(streams, keys, resize); err != nil {
|
||||
if err := c.attach(streams, keys, resize, true); err != nil {
|
||||
attachChan <- err
|
||||
}
|
||||
close(attachChan)
|
||||
}()
|
||||
|
||||
// Start the container
|
||||
if err := c.start(); err != nil {
|
||||
// TODO: interrupt the attach here if we error
|
||||
return nil, err
|
||||
}
|
||||
|
||||
return attachChan, nil
|
||||
}
|
||||
|
||||
@ -421,7 +415,7 @@ func (c *Container) Attach(streams *AttachStreams, keys string, resize <-chan re
|
||||
return errors.Wrapf(ErrCtrStateInvalid, "can only attach to created or running containers")
|
||||
}
|
||||
|
||||
return c.attach(streams, keys, resize)
|
||||
return c.attach(streams, keys, resize, false)
|
||||
}
|
||||
|
||||
// Mount mounts a container's filesystem on the host
|
||||
|
@ -44,7 +44,7 @@ type AttachStreams struct {
|
||||
|
||||
// Attach to the given container
|
||||
// Does not check if state is appropriate
|
||||
func (c *Container) attach(streams *AttachStreams, keys string, resize <-chan remotecommand.TerminalSize) error {
|
||||
func (c *Container) attach(streams *AttachStreams, keys string, resize <-chan remotecommand.TerminalSize, startContainer bool) error {
|
||||
if !streams.AttachOutput && !streams.AttachError && !streams.AttachInput {
|
||||
return errors.Wrapf(ErrInvalidArg, "must provide at least one stream to attach to")
|
||||
}
|
||||
@ -61,12 +61,12 @@ func (c *Container) attach(streams *AttachStreams, keys string, resize <-chan re
|
||||
|
||||
logrus.Debugf("Attaching to container %s", c.ID())
|
||||
|
||||
return c.attachContainerSocket(resize, detachKeys, streams)
|
||||
return c.attachContainerSocket(resize, detachKeys, streams, startContainer)
|
||||
}
|
||||
|
||||
// attachContainerSocket connects to the container's attach socket and deals with the IO
|
||||
// TODO add a channel to allow interrupting
|
||||
func (c *Container) attachContainerSocket(resize <-chan remotecommand.TerminalSize, detachKeys []byte, streams *AttachStreams) error {
|
||||
func (c *Container) attachContainerSocket(resize <-chan remotecommand.TerminalSize, detachKeys []byte, streams *AttachStreams, startContainer bool) error {
|
||||
kubeutils.HandleResizing(resize, func(size remotecommand.TerminalSize) {
|
||||
controlPath := filepath.Join(c.bundlePath(), "ctl")
|
||||
controlFile, err := os.OpenFile(controlPath, unix.O_WRONLY, 0)
|
||||
@ -89,6 +89,12 @@ func (c *Container) attachContainerSocket(resize <-chan remotecommand.TerminalSi
|
||||
}
|
||||
defer conn.Close()
|
||||
|
||||
if startContainer {
|
||||
if err := c.start(); err != nil {
|
||||
return err
|
||||
}
|
||||
}
|
||||
|
||||
receiveStdoutError := make(chan error)
|
||||
if streams.AttachOutput || streams.AttachError {
|
||||
go func() {
|
||||
|
Reference in New Issue
Block a user