35 lines
818 B
Go
35 lines
818 B
Go
package stackutils
|
|
|
|
import (
|
|
"maps"
|
|
"os"
|
|
"path"
|
|
"strings"
|
|
|
|
portainer "github.com/portainer/portainer/api"
|
|
"github.com/portainer/portainer/api/filesystem"
|
|
|
|
"github.com/compose-spec/compose-go/v2/dotenv"
|
|
)
|
|
|
|
// BuildEnvMap builds the environment variable map for stack validation/loading.
|
|
// Priority (lowest to highest): OS env → .env file → stack.Env
|
|
func BuildEnvMap(stack *portainer.Stack) map[string]string {
|
|
env := make(map[string]string, len(os.Environ()))
|
|
for _, e := range os.Environ() {
|
|
k, v, _ := strings.Cut(e, "=")
|
|
env[k] = v
|
|
}
|
|
|
|
dotEnvPath := filesystem.JoinPaths(stack.ProjectPath, path.Dir(stack.EntryPoint), ".env")
|
|
if dotVars, err := dotenv.Read(dotEnvPath); err == nil {
|
|
maps.Copy(env, dotVars)
|
|
}
|
|
|
|
for _, pair := range stack.Env {
|
|
env[pair.Name] = pair.Value
|
|
}
|
|
|
|
return env
|
|
}
|