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.