chmod non funziona correttamente in Docker


18

Sto creando un'immagine Docker per la mia Symfonyapp e devo autorizzare il server Apache a scrivere nella cache e nelle cartelle di registro

#Dockerfile
FROM php:7-apache

RUN apt-get update \
&& apt-get install -y libicu-dev  freetds-common freetds-bin unixodbc \
&& docker-php-ext-install intl mbstring \
&& a2enmod rewrite

COPY app/php.ini /usr/local/etc/php/
COPY app/apache2.conf /etc/apache2/apache2.conf
COPY ./ /var/www/html

RUN find /var/www/html/ -type d -exec chmod 755 {} \; 
RUN find /var/www/html/ -type f -exec chmod 644 {} \;
RUN chmod -R 777 /var/www/html/app/cache /var/www/html/app/logs

Quando creo questa immagine con docker build -t myname/symfony_apps:latest .ed eseguo il contenitore con docker run -p 8080:80 myname/symfony_apps:latest. Il registro di Apache è inondato da errori di autorizzazione negata, la cosa strana con cui ho verificato ls -ae le autorizzazioni vanno bene. e quando eseguo chmod dalla bash del container, i problemi di autorizzazione di apache scompaiono e l'app funziona bene

La situazione

Esecuzione dei comandi chmod da dockerfile: le autorizzazioni vengono modificate ma Apache si lamenta ancora delle autorizzazioni negate. Esecuzione di chmod stessi comandi con bash all'interno del contenitore: le autorizzazioni vengono modificate e la mia app è in esecuzione

Qualche idea, mi sto perdendo qualcosa, forse dovrei aggiungere l'utente root da qualche parte nel Dockerfile?


Sarebbe utile vedere il tuo comando docker che esegue l'immagine costruita.
Mike,

Sto vedendo uno spazio aggiuntivo nel tuo ultimo comando (sono sul mio telefono, quindi non posso esserne sicuro). Poiché il problema con le autorizzazioni sembra riguardare la directory dei registri, modifica l'ultima riga in: `` RUN chmod -R 777 / var / www / html / app / cache / var / www / html / app / logs ``
Mike,

1
Va bene .. Ho modificato la domanda :)
tempesta

quello spazio extra era un refuso
tempesta il

Non riesco a riprodurre il tuo problema. Se uso il file docker e imposto alcuni file fittizi localmente, le autorizzazioni sono corrette e tutto funziona. Posso avviare un contenitore e accedere al contenuto tramite un browser web. Puoi aggiornare la tua domanda per includere messaggi di errore specifici? Sei sicuro che la tua configurazione di Apache ( apache2.conf) non stia causando problemi? Gli errori scompaiono se non si installa apache2.conf?
Larks

Risposte:


15

Ho avuto lo stesso problema e sembra che ci sia qualche bug nella finestra mobile o overlay2 se il contenuto della directory viene creato in un livello e le sue autorizzazioni vengono modificate in un altro.

Per ovviare al problema, è possibile copiare le fonti nella directory temporanea:

COPY . /src

E poi spostalo su /var/www/htmle imposta i permessi (in un solo RUNcomando):

RUN rm -rf /var/www/html && mv /src /var/www/html &&\
    find /var/www/html/ -type d -exec chmod 755 {} \; &&\
    find /var/www/html/ -type f -exec chmod 644 {} \; &&\
    chmod -R 777 /var/www/html/app/cache /var/www/html/app/logs

Inoltre ho creato il problema GitHub .


Stavo per scavare nel mio vecchio codice sorgente questa notte per vedere come ho risolto questo, poi mi sono ricordato di quel trucco della directory tmp .. spero che questo non ti abbia impiegato molto tempo per risolvere XD
storm

7

La shell predefinita di RUN in Docker è / bin / sh ed è qui che le autorizzazioni non impostate correttamente hanno effettivamente un problema.

Ma puoi cambiare semplicemente usando / bin / bash invece di aggiustarlo facilmente, notando l'elenco delle directory prima e dopo

Step 7/9 : RUN /bin/bash -c 'ls -la; chmod +x gitlab-properties-builder.sh; ls -la'
---> Running in dc57ae77aa67

drwxr-xr-x. 3 root root      103 Mar  8 17:56 .
drwxr-xr-x. 1 root root       46 Mar  8 17:57 ..
drwxr-xr-x. 2 root root        6 Mar  7 20:47 config
-rw-r--r--. 1 root root     2340 Mar  7 21:20 gitlab-properties-builder.sh
-rw-r--r--. 5 root root 57325770 Mar  5 14:39 gitlab-scm-collector-2.0.5-SNAPSHOT.jar

drwxr-xr-x. 1 root root       42 Mar  8 17:56 .
drwxr-xr-x. 1 root root       61 Mar  8 17:57 ..
drwxr-xr-x. 2 root root        6 Mar  7 20:47 config
-rwxr-xr-x. 1 root root     2340 Mar  7 21:20 gitlab-properties-builder.sh
-rw-r--r--. 5 root root 57325770 Mar  5 14:39 gitlab-scm-collector-2.0.5-SNAPSHOT.jar
---> 8b5de6e348d3

2
Perché /bin/bash -c 'chmod +x file'funziona e no /bin/sh -c 'chmod +x file'?
tempesta

la tua è la soluzione migliore. ha funzionato per me. Grazie .
user1427944

Inoltre, l'utilizzo del nuovo buildkit aiuta in diverse aree, tra cui questa. Provaci. docs.docker.com/develop/develop-images/build_enhancements
Thad Guidry

6

Prova ad aggiungere:

USER root

Ha funzionato per me.


Questa dovrebbe essere la risposta accettata.
Vladimir Kornea,

2
Se passi a root, probabilmente dovresti tornare all'utente precedente al termine o stai diminuendo la sicurezza e la compatibilità del contenitore. Alcune implementazioni di Kubernetes per impostazione predefinita non eseguiranno un contenitore come root, ad esempio.
flickerfly,

2

Questo problema è probabilmente il risultato di una VOLUMEdefinizione all'interno del Dockerfile upstream. Quando un volume è definito nel Dockerfile, è possibile aggiungere file con un comando COPYo ADDdirettamente nell'immagine. Tuttavia, una RUNriga:

  • Creare un contenitore temporaneo usando la definizione dell'immagine a partire dal punto corrente del file docker
    • Quel contenitore temporaneo avrà un volume anonimo montato come te o un'immagine principale specificata nel Dockerfile
    • Il volume anonimo verrà inizializzato dal contenuto dell'immagine
  • Il tuo comando verrà eseguito all'interno del contenitore
    • Se si elenca la directory durante questo RUNcomando, verranno visualizzate le modifiche applicate, ma tali modifiche sono state applicate al volume
  • Al termine del comando di esecuzione, la finestra mobile acquisirà le modifiche nel contenitore
    • Queste modifiche possono essere visualizzate con un docker diffse non si eliminano i contenitori temporanei (è possibile eseguire una build con --rm=falseper farli rimanere)
    • Queste modifiche non includeranno i contenuti del volume anonimo perché non esistono all'interno del filesystem contenitore temporaneo, i volumi sono separati

A causa di questo comportamento, hai la possibilità di:

  1. puoi copiare i tuoi file in un'altra directory e modificare le autorizzazioni lì
  2. puoi correggere le autorizzazioni sul tuo host in modo che vengano copiate direttamente con quelle autorizzazioni
  3. puoi rimuovere il volume dall'immagine, ottenere l'immagine a monte per rimuovere la definizione del volume, oppure puoi ricostruire la tua copia dell'immagine a monte senza la definizione del volume e basare le tue immagini su di essa

Si noti che all'interno delle attuali immagini php, sembra che il volume sia stato rimosso, il che significa che abbiamo effettivamente l'opzione 3.


0

Ho appena fatto un esperimento con il seguente:

FROM alpine

LABEL MAINTAINER="YIMGA YIMGA Salathiel Genèse"
RUN apk add --no-cache inotify-tools
CMD [ "./script.sh" ]
WORKDIR /opt/app/
COPY src/ /opt/app/
RUN chmod a+x *.sh

E funziona alla grande.

tuttavia

Quando eseguo l'override di quel file eseguibile tramite volumi comporre docker, l' executeautorizzazione è semplicemente come ripristinata - tecnicamente ignora l'autorizzazione del file originale.

La correzione per la modalità dev è semplicemente chmod a+x yourfiledall'host, che verrà ereditato al montaggio del volume di composizione.


1
L'intero obiettivo di un volume è montare i file da un punto diverso dall'immagine, quindi se correggi l'immagine e monti un volume sopra di esso, di progettazione non vedrai le tue modifiche dell'immagine. A seconda del motivo per cui hai un volume, la risposta potrebbe essere semplicemente non avere un volume.
BMitch

Sì , BMitch , sono totalmente d'accordo per quanto riguarda l'effetto del volume di montaggio che sovrascrive il contenitore f dall'immagine costruita dalla finestra mobile, ma ... Durante lo sviluppo, sicuramente non vuoi ricostruire / riavviare il contenitore per testare ogni modifica che fare. In quest'ultimo scenario vuoi che monti un volume che sovrascrive l'immagine fs della finestra mobile. E ho affrontato lo stesso problema prima di atterrare qui. Non sono stato condannato da nessuna delle spiegazioni di risposta e ho testato ognuna di esse. Solo allora ho capito cosa stava succedendo e ho pubblicato le mie osservazioni ...
Salathiel Genèse,

... e sospetto che lo scenario che ho vissuto sia lo stesso di quello che ha posto la domanda.
Salathiel Genèse,

L'OP ha indicato di aver riscontrato il problema con un solo docker runcomando e senza montaggi di volume esterni.
BMitch

Oups - Ho perso quell'aspetto ... La risposta giusta per il titolo della domanda giusta, ma non lo scenario descritto. Quindi posso menzionare che non sono riuscito a riprodurre il problema sopra menzionato.
Salathiel Genèse,
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.