package apply import ( "os" "path/filepath" "testing" ) // The container runtimes keep every container's filesystem somewhere the machine may have moved: dockerd's // --data-root on its unit's command line or a drop-in, podman's graphroot, containerd's own tree (novox/hq issue // 339). Each is refused as a place, an access or a mount, wherever it is said. func TestEveryRuntimesDataRootIsRefused(t *testing.T) { dir := t.TempDir() write := func(name, content string) string { t.Helper() p := filepath.Join(dir, name) if err := os.MkdirAll(filepath.Dir(p), 0o755); err != nil { t.Fatal(err) } if err := os.WriteFile(p, []byte(content), 0o644); err != nil { t.Fatal(err) } return p } unit := write("lib/docker.service", "[Service]\nExecStart=/usr/bin/dockerd -H fd:// --data-root /data/docker-a\n") dropIn := write("etc/docker.service.d/root.conf", "[Service]\nExecStart=\nExecStart=/usr/bin/dockerd --data-root=/data/docker-b --log-level warn\n") storage := write("containers/storage.conf", "[storage]\ndriver = \"overlay\"\n graphroot = \"/data/podman\"\nrunroot = \"/run/containers/storage\"\n") before := runtimeConfigs runtimeConfigs = runtimeFiles{daemonJSON: filepath.Join(dir, "none.json"), units: []string{unit}, dropInDirs: []string{filepath.Dir(dropIn)}, storageConf: storage} t.Cleanup(func() { runtimeConfigs = before }) for _, kind := range []placing{placingDirectory, placingAccess, placingMount} { for _, path := range []string{"/var/lib/containerd", "/var/lib/containerd/io.containerd.content.v1", "/data/docker-a/volumes", "/data/docker-b", "/data/podman/overlay"} { if err := refusePath(path, kind, "notes", ""); err == nil { t.Errorf("%v at %s was taken", kind, path) } } if err := refusePath("/data/media", kind, "notes", ""); err != nil { t.Errorf("%v at /data/media: %v", kind, err) } } }