From ee3bb53728d4dd82ed189fb4e6acbab8c1164a51 Mon Sep 17 00:00:00 2001 From: Aditya Date: Thu, 10 Sep 2026 03:56:48 +0530 Subject: [PATCH] Fix Docker mount warnings for custom directories --- internal/configuration/setup/Setup.go | 28 +++++++++++++++------- internal/configuration/setup/Setup_test.go | 11 +++++++++ 2 files changed, 30 insertions(+), 9 deletions(-) diff --git a/internal/configuration/setup/Setup.go b/internal/configuration/setup/Setup.go index 387defe4..16b19f6c 100644 --- a/internal/configuration/setup/Setup.go +++ b/internal/configuration/setup/Setup.go @@ -16,6 +16,7 @@ import ( "net/http" "net/url" "os" + "path" "runtime" "strconv" "strings" @@ -717,15 +718,15 @@ type setupView struct { func (v *setupView) loadFromConfig() { v.IsInitialSetup = isInitialSetup + env := environment.New() if environment.IsDockerInstance() { v.IsDocker = true - v.IsDataNotMounted = !isVolumeMounted("/app/data") - v.IsConfigNotMounted = !isVolumeMounted("/app/config") + v.IsDataNotMounted = !isVolumeMounted(env.DataDir) + v.IsConfigNotMounted = !isVolumeMounted(env.ConfigDir) } v.HasAwsFeature = aws.IsIncludedInBuild v.ProtectedUrls = protectedUrls if isInitialSetup { - env := environment.New() v.MinPasswordLength = env.MinLengthPassword v.CloudSettings, _ = cloudconfig.Load() v.S3EnvProvided = env.IsAwsProvided() @@ -748,7 +749,6 @@ func (v *setupView) loadFromConfig() { } else { v.Port = environment.DefaultPort } - env := environment.New() v.S3EnvProvided = env.IsAwsProvided() v.MinPasswordLength = env.MinLengthPassword @@ -757,19 +757,29 @@ func (v *setupView) loadFromConfig() { v.DatabaseSettings = dbSettings } -func isVolumeMounted(path string) bool { +func isVolumeMounted(dir string) bool { file, err := os.Open("/proc/mounts") if err != nil { fmt.Println(err) return false } defer file.Close() + return isPathMounted(file, dir) +} - scanner := bufio.NewScanner(file) +func isPathMounted(mounts io.Reader, dir string) bool { + if !path.IsAbs(dir) { + dir = path.Join("/app", dir) + } + dir = path.Clean(dir) + scanner := bufio.NewScanner(mounts) for scanner.Scan() { - line := scanner.Text() - fields := strings.Fields(line) - if len(fields) > 1 && fields[1] == path { + fields := strings.Fields(scanner.Text()) + if len(fields) < 2 { + continue + } + mountPath := path.Clean(fields[1]) + if mountPath != "/" && (dir == mountPath || strings.HasPrefix(dir, mountPath+"/")) { return true } } diff --git a/internal/configuration/setup/Setup_test.go b/internal/configuration/setup/Setup_test.go index 2bd326fc..8100e7aa 100644 --- a/internal/configuration/setup/Setup_test.go +++ b/internal/configuration/setup/Setup_test.go @@ -175,6 +175,17 @@ func TestAddTrailingSlash(t *testing.T) { test.IsEqualString(t, addTrailingSlash("test2/"), "test2/") } +func TestIsPathMounted(t *testing.T) { + mounts := strings.NewReader("overlay / overlay rw 0 0\n/dev/vda /mnt_vol ext4 rw 0 0\n") + test.IsEqualBool(t, isPathMounted(mounts, "/mnt_vol/data"), true) + + mounts = strings.NewReader("overlay / overlay rw 0 0\n/dev/vdb /app/data ext4 rw 0 0\n") + test.IsEqualBool(t, isPathMounted(mounts, "data"), true) + + mounts = strings.NewReader("overlay / overlay rw 0 0\n") + test.IsEqualBool(t, isPathMounted(mounts, "/mnt_vol/data"), false) +} + func TestError(t *testing.T) { w := httptest.NewRecorder() outputError(w, errors.New("test error"))