Come aggiungere un file a un contenitore finestra mobile che non ha autorizzazioni di root?


16

Sto provando ad aggiungere un file a un'immagine Docker creata tomcatdall'immagine ufficiale . L'immagine non sembra avere i privilegi di root, dato che tomcatho eseguito l' accesso come utente se avessi eseguito bash:

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

Se chiedo a Dockerfiledi copiare un file in quel contenitore, il file ha le autorizzazioni 644e il proprietario lo è root. A quanto ho capito, sembra ragionevole dato che tutti i comandi nel Dockerfile vengono eseguiti come root. Tuttavia, se provo a cambiare la proprietà di quel file tomcat:tomcat, visualizzo un Operation not permittederrore.

Perché non posso modificare le autorizzazioni di un file copiato in quell'immagine?

Come può essere riprodotto:

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 .

L'output di 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

Risposte:


20

C'è probabilmente un modo per visualizzare e modificare il Dockerfile per Tomcat, ma non riesco a capirlo dopo pochi minuti. La mia soluzione non elegante è quella di aggiungere questa riga prima dell'abito:

USER root

Se si desidera deselezionare i privilegi dopo (che è consigliato) è possibile aggiungere questa riga:

USER tomcat

In alternativa, lavora con un'immagine senza software installato in modo da poter iniziare il tuo Dockerfile come root e installare Tomcat e tutto il resto. In realtà è strano che lo cambino a loro immagine dalla mia esperienza. Ha senso consentire all'utente finale previsto di impostare la direttiva USER come ritiene opportuno.


Funziona davvero! Sai per caso perché i comandi ADD e COPY creano file con il proprietario root? Perché non tengono USERconto della direttiva?
nyi

1
Bene, in genere non vedi le immagini di base che impostano la direttiva, in quanto non esiste un modo reale per sapere quali account utente saranno sul sistema. Potrebbe anche essere più semplice creare i file come root poiché è ciò che Docker deve eseguire come. Sembra una richiesta di miglioramento ragionevole, semplificherebbe la costruzione di Dockerfile se le cose potessero essere automaticamente di proprietà di quanto stabilito dalla direttiva USER.
theterribletrivium

Grazie, mi ha davvero messo fuori dalla mia miseria. Avevo bisogno di aggiungere chiavi ssh in un'immagine Jenkins.
Kostas Demiris,

8

Dal Docker 17.09 si può usare il --chownflag sulle operazioni ADD / COPY in Dockerfile per cambiare il proprietario nel passaggio ADD / COPY stesso piuttosto che un'operazione RUN separata con chown che aumenta la dimensione dell'immagine come hai notato. Sarebbe stato utile avere questa come modalità predefinita, ovvero le autorizzazioni dell'utente che copiano i file vengono applicate ai file copiati. Tuttavia, il team Docker non voleva interrompere la compatibilità con le versioni precedenti e quindi ha introdotto una nuova bandiera.

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

Le altre alternative sono:

  1. Modificare l'autorizzazione in una cartella di gestione temporanea prima di creare l'immagine.
  2. Esegui il contenitore tramite uno script bootstrap che modifica la proprietà.
  3. Schiaccia i livelli!
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.