diff --git a/CHANGELOG.md b/CHANGELOG.md index 63eb9ee1e1c..52677ffed7f 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -3,6 +3,7 @@ BUG FIXES: * core: Fixed a bug that only ran a task `shutdown_delay` if the task had a registered service [[GH-7663](https://github.com/hashicorp/nomad/issues/7663)] + * driver/docker: Fixed a bug where retrying failed docker creation may in rare cases trigger a panic [[GH-7749](https://github.com/hashicorp/nomad/issues/7749)] * vault: Upgrade http2 library to fix Vault API calls that fail with `http2: no cached connection was available` [[GH-7673](https://github.com/hashicorp/nomad/issues/7673)] ## 0.11.0 (April 8, 2020) diff --git a/drivers/docker/driver.go b/drivers/docker/driver.go index 5880d976d2e..1d8cc743690 100644 --- a/drivers/docker/driver.go +++ b/drivers/docker/driver.go @@ -439,16 +439,21 @@ CREATE: return container, nil } - // Delete matching containers - err = client.RemoveContainer(docker.RemoveContainerOptions{ - ID: container.ID, - Force: true, - }) - if err != nil { - d.logger.Error("failed to purge container", "container_id", container.ID) - return nil, recoverableErrTimeouts(fmt.Errorf("Failed to purge container %s: %s", container.ID, err)) - } else { - d.logger.Info("purged container", "container_id", container.ID) + // Purge conflicting container if found. + // If container is nil here, the conflicting container was + // deleted in our check here, so retry again. + if container != nil { + // Delete matching containers + err = client.RemoveContainer(docker.RemoveContainerOptions{ + ID: container.ID, + Force: true, + }) + if err != nil { + d.logger.Error("failed to purge container", "container_id", container.ID) + return nil, recoverableErrTimeouts(fmt.Errorf("Failed to purge container %s: %s", container.ID, err)) + } else { + d.logger.Info("purged container", "container_id", container.ID) + } } if attempted < 5 {