diff --git a/components/engine/daemon/container.go b/components/engine/daemon/container.go index d680f50573..9cbee88f2d 100644 --- a/components/engine/daemon/container.go +++ b/components/engine/daemon/container.go @@ -55,6 +55,16 @@ func (daemon *Daemon) GetContainer(prefixOrName string) (*container.Container, e return daemon.containers.Get(containerID), nil } +// checkContainer make sure the specified container validates the specified conditions +func (daemon *Daemon) checkContainer(container *container.Container, conditions ...func(*container.Container) error) error { + for _, condition := range conditions { + if err := condition(container); err != nil { + return err + } + } + return nil +} + // Exists returns a true if a container of the specified ID or name exists, // false otherwise. func (daemon *Daemon) Exists(id string) bool { diff --git a/components/engine/daemon/container_operations_unix.go b/components/engine/daemon/container_operations_unix.go index c5e623cdd3..67b3ee38c0 100644 --- a/components/engine/daemon/container_operations_unix.go +++ b/components/engine/daemon/container_operations_unix.go @@ -58,32 +58,34 @@ func (daemon *Daemon) setupLinkedContainers(container *container.Container) ([]s func (daemon *Daemon) getIpcContainer(container *container.Container) (*container.Container, error) { containerID := container.HostConfig.IpcMode.Container() - c, err := daemon.GetContainer(containerID) + container, err := daemon.GetContainer(containerID) if err != nil { - return nil, err + return nil, errors.Wrapf(err, "cannot join IPC of a non running container: %s", container.ID) } - if !c.IsRunning() { - return nil, fmt.Errorf("cannot join IPC of a non running container: %s", containerID) - } - if c.IsRestarting() { - return nil, errContainerIsRestarting(container.ID) - } - return c, nil + return container, daemon.checkContainer(container, containerIsRunning, containerIsNotRestarting) } func (daemon *Daemon) getPidContainer(container *container.Container) (*container.Container, error) { containerID := container.HostConfig.PidMode.Container() - c, err := daemon.GetContainer(containerID) + container, err := daemon.GetContainer(containerID) if err != nil { - return nil, err + return nil, errors.Wrapf(err, "cannot join PID of a non running container: %s", container.ID) } + return container, daemon.checkContainer(container, containerIsRunning, containerIsNotRestarting) +} + +func containerIsRunning(c *container.Container) error { if !c.IsRunning() { - return nil, fmt.Errorf("cannot join PID of a non running container: %s", containerID) + return errors.Errorf("container %s is not running", c.ID) } + return nil +} + +func containerIsNotRestarting(c *container.Container) error { if c.IsRestarting() { - return nil, errContainerIsRestarting(container.ID) + return errContainerIsRestarting(c.ID) } - return c, nil + return nil } func (daemon *Daemon) setupIpcDirs(c *container.Container) error {