Emissione di autorizzazioni con i volumi di Docker

Voglio iniziare a utilizzare Docker per lo sviluppo di Rails, quindi cerco di mettere insieme uno scheletro che posso utilizzare per tutte le mie applicazioni.

Tuttavia, ho eseguito un problema con i volumi e le autorizzazioni di Docker.

Voglio bind-montare la directory dell'applicazione nel contenitore, in modo che tutte le modifiche si propagino al contenitore senza la necessità di ricostruirlo.

Ma se lo definisco come un volume nel mio docker-compose.yml , non posso più chown l'elenco. Ho bisogno che la directory e tutti i suoi contenuti siano di properties; dell'utilizzatore app in modo che il passeggero funzioni correttamente.

Ho letto che non è ansible chown volumi.

Conosci qualche soluzione?

Io uso una soluzione hacky per gestire questo problema per i miei ambienti di sviluppo. Da utilizzare solo in ambienti di sviluppo !

Le immagini che utilizzo per gli ambienti di sviluppo contengono uno script che ha questo aspetto:

 #!/bin/sh # In usr/local/bin/change-dev-id # Change the "dev" user UID and GID # Retrieve new ids to apply NEWUID=$1 NEWGID=$1 if [ $# -eq 2 ] then NEWGID=$2 elif [ $# -ne 1 ] then echo "Usage: change-dev-id NEWUID [NEWGID]" echo "If NEWGID is not provided, its value will be the same as NEWUID" exit 1 fi # Retrieve old ids OLDUID=`id -u dev` OLDGID=`id -g dev` # Change the user ids usermod -u ${NEWUID} dev groupmod -g ${NEWGID} dev # Change the files ownership find / -not \( -path /proc -prune \) -user ${OLDUID} -exec chown -h ${NEWUID} {} \; find / -not \( -path /proc -prune \) -group ${OLDGID} -exec chgrp -h ${NEWGID} {} \; echo "UID and GID changed from ${OLDUID}:${OLDGID} to ${NEWUID}:${NEWGID} for \"dev\"" exit 0 

Nel Dockerfile della mia image di base, lo aggiungo e renderlo eseguibile:

 # Add a script to modify the dev user UID / GID COPY change-dev-id /usr/local/bin/change-dev-id RUN chmod +x /usr/local/bin/change-dev-id 

Quindi, invece di cambiare il proprietario della cartella montata, cambio l'ID dell'utilizzatore del contenitore per corrispondere all'ID del mio utente nella macchina host:

 # In the Dockerfile of the project's development environment, change the ID of # the user that must own the files in the volume so that it match the ID of # the user on the host RUN change-dev-id 1234 

Questo è molto aggraziato ma può essere molto conveniente. Posso possedere i file del progetto sulla mia macchina mentre l'utente nel contenitore ha anche le autorizzazioni corrette.

È ansible aggiornare il codice dello script per utilizzare il nome utente desiderato (la mia è sempre "dev") oppure modificarlo per passare il nome utente come argomento.

Potresti provare a eseguire il chown invece da CMD . Piace:

 CMD chown -R app:app /home/app/webapp && /sbin/my_init 

RUN istruzioni RUN vengono eseguite solo durante il tempo di costruzione dell'image. Ma non hai ancora volumi montati.

CMD invece viene eseguito durante il runtime del contenitore quando i volumi sono già montati. Quindi avrebbe l'effetto che vuoi.