diff --git a/pkg/kubelet/dockertools/manager.go b/pkg/kubelet/dockertools/manager.go index 10ac9e281f3..9da26e6b7b0 100644 --- a/pkg/kubelet/dockertools/manager.go +++ b/pkg/kubelet/dockertools/manager.go @@ -1494,14 +1494,28 @@ func (dm *DockerManager) runContainerInPod(pod *api.Pod, container *api.Containe if err != nil { return kubecontainer.ContainerID{}, fmt.Errorf("InspectContainer: %v", err) } + + if !containerInfo.State.Running { + if container.Name == PodInfraContainerName { + // If the infra container exited prematurely, return an error to raise + // awareness. + return id, fmt.Errorf("Infra container %q exited prematruely", id) + } + // For a user container, simply returns since we cannot apply oom score + // anymore. + glog.V(4).Info("Container %q already exited", containerInfo.ID) + return id, nil + } + // Ensure the PID actually exists, else we'll move ourselves. + // TODO: Should we simply log the error (or send an event) and move on? We + // don't check the oom score in the next sync and correct it anyway. if containerInfo.State.Pid == 0 { return kubecontainer.ContainerID{}, fmt.Errorf("can't get init PID for container %q", id) } - // Check if current docker version is higher than 1.10. Otherwise, we have to apply OOMScoreAdj instead of using docker API. - err = dm.applyOOMScoreAdjIfNeeded(container, containerInfo) - if err != nil { + // TODO: Remove this logic after we stop supporting docker version < 1.10. + if err := dm.applyOOMScoreAdjIfNeeded(container, containerInfo); err != nil { return kubecontainer.ContainerID{}, err }