fix docker media path normalization

This commit is contained in:
ShukeBta
2026-07-01 14:24:24 +08:00
parent 7cf0e468ff
commit 7ebeddfa38
14 changed files with 283 additions and 21 deletions
+36 -5
View File
@@ -70,7 +70,7 @@ func resolveMappedDestinationPath(path string) string {
return ""
}
clean := filepath.Clean(path)
if _, err := os.Stat(clean); err == nil {
if _, err := os.Stat(clean); err == nil && !isRelativeVolumeMarkerPath(clean) {
return clean
}
for _, candidate := range mappedPathCandidates(clean) {
@@ -97,6 +97,11 @@ func mappedPathCandidates(input string) []string {
candidates = append(candidates, candidate)
}
clean := filepath.Clean(input)
if isRelativeVolumeMarkerPath(clean) {
for _, candidate := range dockerVolumePathCandidates(clean) {
add(candidate)
}
}
add(clean)
for _, candidate := range dockerVolumePathCandidates(input) {
add(candidate)
@@ -141,6 +146,22 @@ func dockerVolumePathCandidates(path string) []string {
{env: "MEDIASTATION_MEDIA_DIR", container: envOrDefault("MEDIASTATION_MEDIA_CONTAINER_DIR", "/media")},
{env: "MEDIASTATION_DOWNLOAD_DIR", container: envOrDefault("MEDIASTATION_DOWNLOAD_CONTAINER_DIR", "/downloads")},
} {
container := cleanPathForVolumeMapping(mapping.container)
if container == "." || container == "" || strings.HasPrefix(container, ".") {
continue
}
relativeMarker := strings.TrimPrefix(normalized, "./")
if !strings.HasPrefix(relativeMarker, "/") {
containerBase := strings.TrimSpace(filepath.Base(container))
if relativeMarker == containerBase {
addCandidate(container)
continue
}
if strings.HasPrefix(relativeMarker, containerBase+"/") {
addCandidate(container + strings.TrimPrefix(relativeMarker, containerBase))
continue
}
}
host := cleanPathForVolumeMapping(os.Getenv(mapping.env))
if host == "." || host == "" || strings.HasPrefix(host, ".") {
continue
@@ -152,10 +173,6 @@ func dockerVolumePathCandidates(path string) []string {
if strings.HasPrefix(normalized, host+"/") {
addCandidate(mapping.container + strings.TrimPrefix(normalized, host))
}
container := cleanPathForVolumeMapping(mapping.container)
if container == "." || container == "" || strings.HasPrefix(container, ".") {
continue
}
if normalized == container {
addCandidate(host)
continue
@@ -187,6 +204,20 @@ func dockerVolumePathCandidates(path string) []string {
return candidates
}
func isRelativeVolumeMarkerPath(path string) bool {
normalized := cleanPathForVolumeMapping(path)
normalized = strings.TrimPrefix(normalized, "./")
if normalized == "" || strings.HasPrefix(normalized, "/") || filepath.IsAbs(path) {
return false
}
for _, marker := range []string{"media", "downloads"} {
if normalized == marker || strings.HasPrefix(normalized, marker+"/") {
return true
}
}
return false
}
func cleanPathForVolumeMapping(path string) string {
path = strings.TrimSpace(path)
if path == "" {