Agenten kör som root i containern. Varje Compose-jobb skriver compose.override.yaml via en temporär fil och os.Rename (internal/agent/updater/override.go:82-98), så filen skapas på nytt och ägs av root:root efter varje jobb. Ägarbyten som någon gjort för hand försvinner vid nästa uppdatering. Den som äger stacken behöver sudo för att redigera eller ta bort filen.
Förväntat beteende
Override-filen får samma ägare (uid:gid) som stacken den hör till.
Teknisk orsak
os.CreateTemp skapar filen med processens uid (0). Rename behåller den temporära filens ägare.
Förslag till lösning
I override.go, efter tmp.Chmod(0o644) och före Rename, gör tmp.Chown(uid, gid) där ägaren hämtas så här:
från den befintliga compose.override.yaml, om den finns
annars från stackens första compose-fil (den första i config_files), som är en bättre signal än katalogen eftersom katalogen kan ägas av root, till exempel /opt/stacks
Om Chown misslyckas, till exempel för att agenten inte kör som root, ska jobbet inte fallera. Felet ska skrivas i jobbets output och loggas på Warn-nivå.
Tester: ägaren tas från den befintliga filen, annars från compose-filen, och ett misslyckat Chown stoppar inte jobbet. Ett riktigt ägarbyte kräver root, så själva hämtningen av ägaren testas via en funktionsvariabel eller ett litet interface som går att byta ut i testerna.
Scope
Ingår inte: att köra agenten som en annan användare än root. Docker-socketen ger root-rättigheter på värden ändå.
## Beskrivning
Agenten kör som root i containern. Varje Compose-jobb skriver `compose.override.yaml` via en temporär fil och `os.Rename` (`internal/agent/updater/override.go:82-98`), så filen skapas på nytt och ägs av `root:root` efter varje jobb. Ägarbyten som någon gjort för hand försvinner vid nästa uppdatering. Den som äger stacken behöver `sudo` för att redigera eller ta bort filen.
## Förväntat beteende
Override-filen får samma ägare (uid:gid) som stacken den hör till.
## Teknisk orsak
`os.CreateTemp` skapar filen med processens uid (0). `Rename` behåller den temporära filens ägare.
## Förslag till lösning
I `override.go`, efter `tmp.Chmod(0o644)` och före `Rename`, gör `tmp.Chown(uid, gid)` där ägaren hämtas så här:
1. från den befintliga `compose.override.yaml`, om den finns
2. annars från stackens första compose-fil (den första i `config_files`), som är en bättre signal än katalogen eftersom katalogen kan ägas av root, till exempel `/opt/stacks`
Om `Chown` misslyckas, till exempel för att agenten inte kör som root, ska jobbet inte fallera. Felet ska skrivas i jobbets output och loggas på Warn-nivå.
Tester: ägaren tas från den befintliga filen, annars från compose-filen, och ett misslyckat `Chown` stoppar inte jobbet. Ett riktigt ägarbyte kräver root, så själva hämtningen av ägaren testas via en funktionsvariabel eller ett litet interface som går att byta ut i testerna.
## Scope
Ingår inte: att köra agenten som en annan användare än root. Docker-socketen ger root-rättigheter på värden ändå.
Blocking a user prevents them from interacting with repositories, such as opening or commenting on pull requests or issues. Learn more about blocking a user.
Beskrivning
Agenten kör som root i containern. Varje Compose-jobb skriver
compose.override.yamlvia en temporär fil ochos.Rename(internal/agent/updater/override.go:82-98), så filen skapas på nytt och ägs avroot:rootefter varje jobb. Ägarbyten som någon gjort för hand försvinner vid nästa uppdatering. Den som äger stacken behöversudoför att redigera eller ta bort filen.Förväntat beteende
Override-filen får samma ägare (uid:gid) som stacken den hör till.
Teknisk orsak
os.CreateTempskapar filen med processens uid (0).Renamebehåller den temporära filens ägare.Förslag till lösning
I
override.go, eftertmp.Chmod(0o644)och föreRename, görtmp.Chown(uid, gid)där ägaren hämtas så här:compose.override.yaml, om den finnsconfig_files), som är en bättre signal än katalogen eftersom katalogen kan ägas av root, till exempel/opt/stacksOm
Chownmisslyckas, till exempel för att agenten inte kör som root, ska jobbet inte fallera. Felet ska skrivas i jobbets output och loggas på Warn-nivå.Tester: ägaren tas från den befintliga filen, annars från compose-filen, och ett misslyckat
Chownstoppar inte jobbet. Ett riktigt ägarbyte kräver root, så själva hämtningen av ägaren testas via en funktionsvariabel eller ett litet interface som går att byta ut i testerna.Scope
Ingår inte: att köra agenten som en annan användare än root. Docker-socketen ger root-rättigheter på värden ändå.