in ecs-init/engine/engine.go [227:274]
func (e *Engine) StartSupervised() error {
docker, err := getDockerClient()
if err != nil {
return dockerError(err)
}
agentExitCode := -1
retryBackoff := backoff.NewBackoff(serviceStartMinRetryTime, serviceStartMaxRetryTime,
serviceStartRetryJitter, serviceStartRetryMultiplier, serviceStartMaxRetries)
for {
err := docker.RemoveExistingAgentContainer()
if err != nil {
return engineError("could not remove existing Agent container", err)
}
log.Info("Starting Amazon Elastic Container Service Agent")
agentExitCode, err = docker.StartAgent()
if err != nil {
return engineError("could not start Agent", err)
}
log.Infof("Agent exited with code %d", agentExitCode)
switch agentExitCode {
case upgradeAgentExitCode:
err = e.upgradeAgent(docker)
if err != nil {
log.Error("could not upgrade agent", err)
} else {
// continuing here because a successful upgrade doesn't need to backoff retries
continue
}
case containerFailureAgentExitCode:
// capture the tail of the failed agent container
log.Infof("Captured the last %s lines of the agent container logs====>\n", failedContainerLogWindowSize)
log.Info(docker.GetContainerLogTail(failedContainerLogWindowSize))
log.Infof("<====end %s lines of the failed agent container logs\n", failedContainerLogWindowSize)
case TerminalFailureAgentExitCode:
return &TerminalError{
err: "agent exited with terminal exit code",
exitCode: TerminalFailureAgentExitCode,
}
case terminalSuccessAgentExitCode:
return nil
}
d := retryBackoff.Duration()
log.Warnf("ECS Agent failed to start, retrying in %s", d)
time.Sleep(d)
}
}