mirror of
https://github.com/containrrr/watchtower.git
synced 2025-12-29 05:08:48 +01:00
fix(lifecycle): cleanup lifecycle
- removes unwieldy SkipUpdate return value in favor of errors.Is - generalizes the code for all four phases - allows timeout to be defined for all phases - enables explicit unit in timeout label values (in addition to implicit minutes)
This commit is contained in:
parent
76f9cea516
commit
023c1a7d93
10 changed files with 160 additions and 179 deletions
|
|
@ -31,7 +31,7 @@ type Client interface {
|
|||
StartContainer(t.Container) (t.ContainerID, error)
|
||||
RenameContainer(t.Container, string) error
|
||||
IsContainerStale(t.Container, t.UpdateParams) (stale bool, latestImage t.ImageID, err error)
|
||||
ExecuteCommand(containerID t.ContainerID, command string, timeout int) (SkipUpdate bool, err error)
|
||||
ExecuteCommand(containerID t.ContainerID, command string, timeout time.Duration) error
|
||||
RemoveImageByID(t.ImageID) error
|
||||
WarnOnHeadPullFailed(container t.Container) bool
|
||||
}
|
||||
|
|
@ -439,7 +439,7 @@ func (client dockerClient) RemoveImageByID(id t.ImageID) error {
|
|||
return err
|
||||
}
|
||||
|
||||
func (client dockerClient) ExecuteCommand(containerID t.ContainerID, command string, timeout int) (SkipUpdate bool, err error) {
|
||||
func (client dockerClient) ExecuteCommand(containerID t.ContainerID, command string, timeout time.Duration) error {
|
||||
bg := context.Background()
|
||||
clog := log.WithField("containerID", containerID)
|
||||
|
||||
|
|
@ -452,7 +452,7 @@ func (client dockerClient) ExecuteCommand(containerID t.ContainerID, command str
|
|||
|
||||
exec, err := client.api.ContainerExecCreate(bg, string(containerID), execConfig)
|
||||
if err != nil {
|
||||
return false, err
|
||||
return err
|
||||
}
|
||||
|
||||
response, attachErr := client.api.ContainerExecAttach(bg, exec.ID, types.ExecStartCheck{
|
||||
|
|
@ -467,7 +467,7 @@ func (client dockerClient) ExecuteCommand(containerID t.ContainerID, command str
|
|||
execStartCheck := types.ExecStartCheck{Detach: false, Tty: true}
|
||||
err = client.api.ContainerExecStart(bg, exec.ID, execStartCheck)
|
||||
if err != nil {
|
||||
return false, err
|
||||
return err
|
||||
}
|
||||
|
||||
var output string
|
||||
|
|
@ -484,24 +484,16 @@ func (client dockerClient) ExecuteCommand(containerID t.ContainerID, command str
|
|||
|
||||
// Inspect the exec to get the exit code and print a message if the
|
||||
// exit code is not success.
|
||||
skipUpdate, err := client.waitForExecOrTimeout(bg, exec.ID, output, timeout)
|
||||
if err != nil {
|
||||
return true, err
|
||||
}
|
||||
|
||||
return skipUpdate, nil
|
||||
return client.waitForExecOrTimeout(bg, exec.ID, output, timeout)
|
||||
}
|
||||
|
||||
func (client dockerClient) waitForExecOrTimeout(bg context.Context, ID string, execOutput string, timeout int) (SkipUpdate bool, err error) {
|
||||
func (client dockerClient) waitForExecOrTimeout(ctx context.Context, ID string, execOutput string, timeout time.Duration) error {
|
||||
const ExTempFail = 75
|
||||
var ctx context.Context
|
||||
var cancel context.CancelFunc
|
||||
|
||||
if timeout > 0 {
|
||||
ctx, cancel = context.WithTimeout(bg, time.Duration(timeout)*time.Minute)
|
||||
var cancel context.CancelFunc
|
||||
ctx, cancel = context.WithTimeout(ctx, timeout)
|
||||
defer cancel()
|
||||
} else {
|
||||
ctx = bg
|
||||
}
|
||||
|
||||
for {
|
||||
|
|
@ -516,7 +508,7 @@ func (client dockerClient) waitForExecOrTimeout(bg context.Context, ID string, e
|
|||
}).Debug("Awaiting timeout or completion")
|
||||
|
||||
if err != nil {
|
||||
return false, err
|
||||
return err
|
||||
}
|
||||
if execInspect.Running {
|
||||
time.Sleep(1 * time.Second)
|
||||
|
|
@ -527,15 +519,15 @@ func (client dockerClient) waitForExecOrTimeout(bg context.Context, ID string, e
|
|||
}
|
||||
|
||||
if execInspect.ExitCode == ExTempFail {
|
||||
return true, nil
|
||||
return ErrorLifecycleSkip
|
||||
}
|
||||
|
||||
if execInspect.ExitCode > 0 {
|
||||
return false, fmt.Errorf("command exited with code %v %s", execInspect.ExitCode, execOutput)
|
||||
return fmt.Errorf("command exited with code %v", execInspect.ExitCode)
|
||||
}
|
||||
break
|
||||
}
|
||||
return false, nil
|
||||
return nil
|
||||
}
|
||||
|
||||
func (client dockerClient) waitForStopOrTimeout(c t.Container, waitTime time.Duration) error {
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue