@@ -61,21 +61,24 @@ func SystemInit(ctx context.Context, cfg config.Configuration, staticStore *stor
6161 return nil
6262}
6363
64- func pullImage ( ctx context. Context , stdout io. Writer , docker dockerClient. APIClient , imageName string ) error {
65- delay := 1 * time .Second
64+ const minDelay = 1 * time . Second
65+ const maxDelay = 10 * time .Second
6666
67+ func pullImage (ctx context.Context , stdout io.Writer , docker dockerClient.APIClient , imageName string ) error {
68+ delay := minDelay
6769 var out io.ReadCloser
6870 var allErr error
6971 var lastErr error
70- for range 4 { // 1s, 2s, 4s, 8s
72+ for range 10 { // 1s, 2s, 4s, 8s, 10s, 10s, 10s, 10s, 10s, 10s
7173 out , lastErr = docker .ImagePull (ctx , imageName , image.PullOptions {})
7274 if lastErr == nil {
7375 break // Success
7476 }
77+ allErr = errors .Join (allErr , lastErr )
78+
7579 if ! strings .Contains (lastErr .Error (), "toomanyrequests" ) {
76- return lastErr // Fail fast on non-rate-limit errors
80+ return allErr // Non-retryable error
7781 }
78- allErr = errors .Join (allErr , lastErr )
7982
8083 feedback .Printf ("Warning: received 'toomanyrequests' error from Docker registry, retrying in %s ..." , delay )
8184
@@ -84,7 +87,7 @@ func pullImage(ctx context.Context, stdout io.Writer, docker dockerClient.APICli
8487 return ctx .Err ()
8588 case <- time .After (delay ):
8689 }
87- delay *= 2
90+ delay = min ( delay * 2 , maxDelay )
8891 }
8992 if lastErr != nil {
9093 return fmt .Errorf ("failed to pull image %s after multiple attempts: %w" , imageName , allErr )
0 commit comments