From 56f4bf54dfca066ae3bedd36fd0fc5f2ac4c77b8 Mon Sep 17 00:00:00 2001 From: Natalie Arellano Date: Wed, 31 Jul 2024 13:19:49 -0400 Subject: [PATCH 1/2] Fix ephemeral bridge network name for podman See https://github.com/buildpacks/pack/issues/2219#issuecomment-2260923340 Signed-off-by: Natalie Arellano --- internal/build/lifecycle_execution.go | 2 +- internal/build/lifecycle_execution_test.go | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/internal/build/lifecycle_execution.go b/internal/build/lifecycle_execution.go index 1911c0eed..abf1fc550 100644 --- a/internal/build/lifecycle_execution.go +++ b/internal/build/lifecycle_execution.go @@ -211,7 +211,7 @@ func (l *LifecycleExecution) Run(ctx context.Context, phaseFactoryCreator PhaseF if l.os == "windows" { driver = "nat" } - networkName := fmt.Sprintf("pack.local/network/%x", randString(10)) + networkName := fmt.Sprintf("pack.local-network-%x", randString(10)) resp, err := l.docker.NetworkCreate(ctx, networkName, types.NetworkCreate{ Driver: driver, }) diff --git a/internal/build/lifecycle_execution_test.go b/internal/build/lifecycle_execution_test.go index 4ab807712..caf4dd105 100644 --- a/internal/build/lifecycle_execution_test.go +++ b/internal/build/lifecycle_execution_test.go @@ -804,7 +804,7 @@ func testLifecycleExecution(t *testing.T, when spec.G, it spec.S) { h.AssertNil(t, err) for _, entry := range fakePhaseFactory.NewCalledWithProvider { - h.AssertContains(t, string(entry.HostConfig().NetworkMode), "pack.local/network/") + h.AssertContains(t, string(entry.HostConfig().NetworkMode), "pack.local-network-") h.AssertEq(t, entry.HostConfig().NetworkMode.IsDefault(), false) h.AssertEq(t, entry.HostConfig().NetworkMode.IsHost(), false) h.AssertEq(t, entry.HostConfig().NetworkMode.IsNone(), false) From b44f845532c35a61f313e5f0e91730980dad153f Mon Sep 17 00:00:00 2001 From: Natalie Arellano Date: Mon, 5 Aug 2024 11:10:41 -0400 Subject: [PATCH 2/2] Add retries for docker network remove Signed-off-by: Natalie Arellano --- internal/build/lifecycle_execution.go | 11 ++++++++++- 1 file changed, 10 insertions(+), 1 deletion(-) diff --git a/internal/build/lifecycle_execution.go b/internal/build/lifecycle_execution.go index abf1fc550..5f573cf89 100644 --- a/internal/build/lifecycle_execution.go +++ b/internal/build/lifecycle_execution.go @@ -7,6 +7,7 @@ import ( "os" "path/filepath" "strconv" + "time" "github.com/BurntSushi/toml" "github.com/buildpacks/lifecycle/api" @@ -164,6 +165,8 @@ func (l *LifecycleExecution) PrevImageName() string { return l.opts.PreviousImage } +const maxNetworkRemoveRetries = 2 + func (l *LifecycleExecution) Run(ctx context.Context, phaseFactoryCreator PhaseFactoryCreator) error { phaseFactory := phaseFactoryCreator(l) @@ -219,7 +222,13 @@ func (l *LifecycleExecution) Run(ctx context.Context, phaseFactoryCreator PhaseF return fmt.Errorf("failed to create ephemeral %s network: %w", driver, err) } defer func() { - _ = l.docker.NetworkRemove(ctx, networkName) + for i := 0; i <= maxNetworkRemoveRetries; i++ { + time.Sleep(100 * time.Duration(i) * time.Millisecond) // wait if retrying + if err = l.docker.NetworkRemove(ctx, networkName); err != nil { + continue + } + break + } }() l.logger.Debugf("Created ephemeral bridge network %s with ID %s", networkName, resp.ID) if resp.Warning != "" {