Skip to content

Commit f15d0ad

Browse files
authored
Merge pull request containerd#3819 from haytok/fix-to-clean-up-an-orphaned-etchosts-directory
fix: clean up an orphaned etchosts directory for the container that failed to create
2 parents 1259a55 + fcb900e commit f15d0ad

File tree

2 files changed

+58
-8
lines changed

2 files changed

+58
-8
lines changed

cmd/nerdctl/container/container_run_network_linux_test.go

Lines changed: 47 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -22,17 +22,20 @@ import (
2222
"net"
2323
"os"
2424
"os/exec"
25+
"path/filepath"
2526
"regexp"
2627
"runtime"
2728
"strings"
2829
"testing"
2930
"time"
3031

3132
"github.com/containernetworking/plugins/pkg/ns"
33+
"github.com/opencontainers/go-digest"
3234
"github.com/vishvananda/netlink"
3335
"gotest.tools/v3/assert"
3436
"gotest.tools/v3/icmd"
3537

38+
"github.com/containerd/containerd/v2/defaults"
3639
"github.com/containerd/containerd/v2/pkg/netns"
3740
"github.com/containerd/errdefs"
3841

@@ -41,6 +44,7 @@ import (
4144
"github.com/containerd/nerdctl/v2/pkg/testutil"
4245
"github.com/containerd/nerdctl/v2/pkg/testutil/nerdtest"
4346
"github.com/containerd/nerdctl/v2/pkg/testutil/nettestutil"
47+
"github.com/containerd/nerdctl/v2/pkg/testutil/test"
4448
)
4549

4650
func extractHostPort(portMapping string, port string) (string, error) {
@@ -350,15 +354,50 @@ func TestRunPort(t *testing.T) {
350354
}
351355

352356
func TestRunWithInvalidPortThenCleanUp(t *testing.T) {
357+
testCase := nerdtest.Setup()
353358
// docker does not set label restriction to 4096 bytes
354-
testutil.DockerIncompatible(t)
355-
t.Parallel()
356-
base := testutil.NewBase(t)
357-
containerName := testutil.Identifier(t)
358-
defer base.Cmd("rm", "-f", containerName).Run()
359-
base.Cmd("run", "--rm", "--name", containerName, "-p", "22200-22299:22200-22299", testutil.CommonImage).AssertFail()
360-
base.Cmd("run", "--rm", "--name", containerName, "-p", "22200-22299:22200-22299", testutil.CommonImage).AssertCombinedOutContains(errdefs.ErrInvalidArgument.Error())
361-
base.Cmd("run", "--rm", "--name", containerName, testutil.CommonImage).AssertOK()
359+
testCase.Require = test.Not(nerdtest.Docker)
360+
361+
testCase.SubTests = []*test.Case{
362+
{
363+
Description: "Run a container with invalid ports, and then clean up.",
364+
Cleanup: func(data test.Data, helpers test.Helpers) {
365+
helpers.Anyhow("rm", "--data-root", data.TempDir(), "-f", data.Identifier())
366+
},
367+
Command: func(data test.Data, helpers test.Helpers) test.TestableCommand {
368+
return helpers.Command("run", "--data-root", data.TempDir(), "--rm", "--name", data.Identifier(), "-p", "22200-22299:22200-22299", testutil.CommonImage)
369+
},
370+
Expected: func(data test.Data, helpers test.Helpers) *test.Expected {
371+
return &test.Expected{
372+
ExitCode: 1,
373+
Errors: []error{errdefs.ErrInvalidArgument},
374+
Output: func(stdout string, info string, t *testing.T) {
375+
getAddrHash := func(addr string) string {
376+
const addrHashLen = 8
377+
378+
d := digest.SHA256.FromString(addr)
379+
h := d.Encoded()[0:addrHashLen]
380+
381+
return h
382+
}
383+
384+
dataRoot := data.TempDir()
385+
h := getAddrHash(defaults.DefaultAddress)
386+
dataStore := filepath.Join(dataRoot, h)
387+
namespace := string(helpers.Read(nerdtest.Namespace))
388+
etchostsPath := filepath.Join(dataStore, "etchosts", namespace)
389+
390+
etchostsDirs, err := os.ReadDir(etchostsPath)
391+
392+
assert.NilError(t, err)
393+
assert.Equal(t, len(etchostsDirs), 0)
394+
},
395+
}
396+
},
397+
},
398+
}
399+
400+
testCase.Run(t)
362401
}
363402

364403
func TestRunContainerWithStaticIP(t *testing.T) {

pkg/cmd/container/create.go

Lines changed: 11 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -888,6 +888,17 @@ func generateGcFunc(ctx context.Context, container containerd.Container, ns, id,
888888
if netGcErr != nil {
889889
log.G(ctx).WithError(netGcErr).Warnf("failed to revert container %q networking settings", id)
890890
}
891+
} else {
892+
hs, err := hostsstore.New(dataStore, internalLabels.namespace)
893+
if err != nil {
894+
log.G(ctx).WithError(err).Warnf("failed to instantiate hostsstore for %q", internalLabels.namespace)
895+
} else {
896+
if _, err := hs.HostsPath(id); err != nil {
897+
log.G(ctx).WithError(err).Warnf("an etchosts directory for container %q dosen't exist", id)
898+
} else if err = hs.Delete(id); err != nil {
899+
log.G(ctx).WithError(err).Warnf("failed to remove an etchosts directory for container %q", id)
900+
}
901+
}
891902
}
892903

893904
ipc, ipcErr := ipcutil.DecodeIPCLabel(internalLabels.ipc)

0 commit comments

Comments
 (0)