Jak dodać plik do kontenera dokowanego, który nie ma uprawnień roota?

16

Próbuję dodać plik do obrazu Docker zbudowanego z oficjalnego tomcatobrazu. Ten obraz nie wydaje się mieć praw root, ponieważ jestem zalogowany jako użytkownik, tomcatjeśli uruchomię bash:

docker run -it tomcat /bin/bash
tomcat@06359f7cc4db:/usr/local/tomcat$ 

Jeśli polecę Dockerfileskopiować plik do tego kontenera, plik ma uprawnienia, 644a właścicielem jest root. O ile rozumiem, wydaje się to rozsądne, ponieważ wszystkie polecenia w pliku Docker są uruchamiane jako root. Jeśli jednak spróbuję zmienić właściciela tego pliku na tomcat:tomcat, pojawia się Operation not permittedbłąd.

Dlaczego nie mogę zmienić uprawnień do pliku skopiowanego do tego obrazu?

Jak można go powielać:

mkdir docker-addfilepermission
cd docker-addfilepermission
touch test.txt
echo 'FROM tomcat
COPY test.txt /usr/local/tomcat/webapps/
RUN chown tomcat:tomcat /usr/local/tomcat/webapps/test.txt' > Dockerfile

docker build .

Wyjście docker build .:

Sending build context to Docker daemon 3.072 kB
Sending build context to Docker daemon 
Step 0 : FROM tomcat
 ---> 44859847ef64
Step 1 : COPY test.txt /usr/local/tomcat/webapps/
 ---> Using cache
 ---> a2ccb92480a4
Step 2 : RUN chown tomcat:tomcat /usr/local/tomcat/webapps/test.txt
 ---> Running in 208e7ff0ec8f
chown: changing ownership of '/usr/local/tomcat/webapps/test.txt': Operation not permitted
2014/11/01 00:30:33 The command [/bin/sh -c chown tomcat:tomcat /usr/local/tomcat/webapps/test.txt] returned a non-zero code: 1
nyi
źródło

Odpowiedzi:

20

Prawdopodobnie istnieje sposób na wyświetlenie i zmianę Dockerfile dla tomcat, ale nie mogę tego rozgryźć po kilku minutach. Moim nieelegacyjnym rozwiązaniem jest dodanie tej linii przed zmianą:

USER root

Jeśli chcesz obniżyć uprawnienia po (co jest zalecane), możesz dodać ten wiersz:

USER tomcat

Alternatywnie, pracuj z obrazem, na którym nie ma zainstalowanego oprogramowania, abyś mógł rozpocząć swój plik Docker jako root i zainstalować tomcat i tak dalej. To dziwne, że zmieniają to w swoim obrazie z mojego doświadczenia. Sensowne jest zezwolenie zamierzonemu użytkownikowi końcowemu na ustawienie dyrektywy USER według własnego uznania.

theterribletrivium
źródło
To rzeczywiście działa! Czy wiesz przypadkiem, dlaczego polecenia DODAJ i KOPIUJ tworzą pliki z właścicielem root? Dlaczego nie uwzględniają USERdyrektywy?
ny
1
Zazwyczaj nie widzisz obrazów podstawowych ustawionych w dyrektywie, ponieważ nie ma prawdziwego sposobu, aby dowiedzieć się, jakie konta użytkowników będą w systemie. Łatwiej też jest po prostu utworzyć pliki jako root, ponieważ właśnie tak musi działać Docker. Wydaje się, że jest to uzasadnione żądanie ulepszenia, uprościłoby to tworzenie Dockerfiles, gdyby rzeczy mogły automatycznie być własnością tego, co zostało określone w dyrektywie USER.
theterribletrivium
Dzięki, naprawdę wyciągnij mnie z nędzy. Musiałem dodać klucze ssh do obrazu Jenkinsa.
Kostas Demiris
8

Od Dockera 17.09 można używać --chownflagi w operacjach DODAJ / KOPIUJ w Dockerfile, aby zmienić właściciela w samym kroku DODAJ / KOPIUJ, zamiast osobnej operacji RUN z chown, która zwiększa rozmiar obrazu, jak już zauważyłeś. Byłoby dobrze, gdyby był to tryb domyślny, tzn. Uprawnienia użytkownika kopiującego pliki są stosowane do kopiowanych plików. Jednak zespół Docker nie chciał złamać kompatybilności wstecznej i dlatego wprowadził nową flagę.

COPY --chown=<user>:<group> <hostPath> <containerPath>

Inne alternatywy to:

  1. Zmień uprawnienia w folderze przemieszczania przed zbudowaniem obrazu.
  2. Uruchom kontener za pomocą skryptu bootstrap, który zmienia własność.
  3. Zgnieść warstwy!
Vinayak Gadkari
źródło