Našel jsem dvě možnosti:
CHOWN všechny věci (poté, co uděláte svou práci)
Udělal jsem 00
a kontejner vytvořil soubory v rámci 18
tak je vlastněn procesem docker. Nicméně 21
je stále v mém vlastnictví. Takže v rámci procesu dockeru ano
33
49
vrátí 59
v mém případě je to 67
mého uživatele. I když neexistuje žádný uživatel 74
v kontejneru dockeru je tam id (a 80
jen řekne "neznámý", když se zeptáte na uživatelské jméno).
Každopádně 94
poslušně převede vlastnictví obsahu 106
na 119
(který, pokud jde, neexistuje, ale mimo kontejner jsem to já). Takže nyní vlastním všechny soubory. Kontejner může stále věci upravovat, pokud chce, protože z jeho pohledu je to 125
.
A se světem je vše v pořádku.
139
takže všechny vytvořené soubory budou mít automaticky správného vlastníka
Dalším způsobem, jak toho dosáhnout, je 146
příznak při spuštění dockeru.
157
Tímto způsobem je uživatel dockeru v kontejneru 162
.
Nicméně: to znamená vzdát se kořenového oprávnění v kontejneru (170
, atd.). Pokud nevytvoříte uživatele s tímto novým uid a nepřidáte ho do 189
skupina.
Je to správně? Může mě někdo nasměrovat na dokumentaci tohoto, jen se domnívám na základě výše uvedeného experimentu.
Možná je to jen proto, že oba mají v jádře stejnou číselnou hodnotu, a pokud bych testoval na systému, kde můj domácí uživatel neměl ID 1000, oprávnění by se v každém případě změnila?
Přečtěte si 198
, což vám může poskytnout lepší představu o tom, jak fungují oprávnění / vlastnictví souborů.
V zásadě má však každý soubor na vašem počítači nalepenou sadu bitů, které definují jeho oprávnění a vlastnictví. Když 201
soubor, právě nastavujete tyto bity.
Když 211
soubor konkrétnímu uživateli/skupině pomocí uživatelského jména nebo názvu skupiny 225
bude hledat v 239
pro uživatelské jméno a 244
aby se skupina pokusila namapovat název na ID. Pokud uživatelské jméno / název skupiny v těchto souborech neexistuje, 255
selže.
[email protected]:/test# touch test
[email protected]:/test# ll
total 8
drwxr-xr-x 2 root root 4096 Oct 22 18:15 ./
drwxr-xr-x 22 root root 4096 Oct 22 18:15 ../
-rw-r--r-- 1 root root 0 Oct 22 18:15 test
[email protected]:/test# chown test:test test
chown: invalid user: 'test:test'
Můžete však 265
soubor používající ID čehokoli, co chcete (samozřejmě v rámci nějakých horních kladných celých čísel), ať už na vašem počítači existuje uživatel/skupina s těmito ID nebo ne.
[email protected]:/test# chown 5000:5000 test
[email protected]:/test# ll
total 8
drwxr-xr-x 2 root root 4096 Oct 22 18:15 ./
drwxr-xr-x 22 root root 4096 Oct 22 18:15 ../
-rw-r--r-- 1 5000 5000 0 Oct 22 18:15 test
Bity UID a GID jsou nastaveny v samotném souboru, takže když tyto soubory připojíte do kontejneru dockeru, soubor má stejné UID vlastníka/skupiny jako na hostiteli, ale je nyní namapován na 277 v kontejneru, což bude pravděpodobně jiný uživatel, pokud jej nevlastní root (UID 0).
Skutečná otázka samozřejmě zní:'Co s tím mám dělat?' Pokud je bob na daném hostitelském počítači přihlášen jako bob, měl by být schopen spustit kontejner jako bob a neměl by mít změněná oprávnění k souboru pod svým hostitelským účtem. Ve skutečnosti potřebuje spouštět kontejner jako uživatelský ukotvitelný panel, aby nedošlo ke změně jeho účtu.
Zdá se, že s vaším aktuálním nastavením se budete muset ujistit, že vaše UID> uživatelská jména v 287
na vašem hostiteli se shodují s vašimi UID> uživatelskými jmény ve vašich kontejnerech 290
pokud chcete pracovat s vaším připojeným uživatelským adresářem jako stejný uživatel, který je přihlášen k hostiteli.
Můžete vytvořit uživatele s konkrétním ID uživatele pomocí 304
. Buuuu, to vypadá jako chaotické řešení...
Možná budete muset přijít s řešením, které nepřipojí domovský adresář hostitelských uživatelů.
Takže jsem skončil v tomto příspěvku a hledal jsem, jak obnovit vlastnictví všech souborů (vlastněných uživatelem root), které vyšly z kontejneru dockeru spuštěného jako root , mému neprivilegovanému uživateli v hostiteli.
Potřeboval jsem, aby se proces uvnitř kontejneru spouštěl jako root, takže při spuštění dockeru nemohu použít -u.
Nejsem hrdý na to, co jsem udělal, ale na konci svého bash skriptu jsem přidal toto:
docker run --rm -it \
--entrypoint /bin/sh \
-e HOST_UID=`id -u` \
-v ${HOST_FOLDER_OWNED_BY_ROOT}:/tmp \
alpine:latest \
-c 'chown -R ${HOST_UID}:${HOST_UID} /tmp/'
Pojďme přerušit některé řádky:
- Spusťte /bin/sh uvnitř kontejneru:
--entrypoint /bin/sh
- Předejte uid aktuálního uživatele jako proměnnou prostředí do kontejneru:
-e HOST_UID=`id -u`
- Připojte libovolnou složku, kterou chcete znovu vlastnit, zpět ke svému uživateli (vyplněnou soubory vlastněnými uživatelem root, na výstupu z předchozího kontejneru, který běžel jako root ), pod číslem
315
tohoto nového kontejneru :
-v ${HOST_FOLDER_OWNED_BY_ROOT}:/tmp
- Spusťte
327
rekurzivně s uid hostitele přes cílový adresář (připojený uvnitř kontejneru v338
):
-c 'chown -R ${HOST_UID}:${HOST_UID} /tmp/'
Tímto jsem tedy dostal vlastněné soubory zpět ke svému současnému uživateli, aniž bych musel „eskalovat“ oprávnění na root nebo sudo.
Je to špinavé, ale fungovalo to. Doufám, že jsem pomohl.