This is an old revision of the document!
Cómo manejar los permisos y propietarios de volumenes con docker-compose
Docker-compose no permite configurar el montaje de volúmenes o directorios, por lo que hay que apoyarse siempre en algo externo a docker-compose para poder configurar los puntos de montaje como se quiera. Se presentan a continuación algunas posibilidades.
Montar volúmenes (no directorios) a partir de un fichero Dockerfile
Este es posiblemente el mejor método de configurar un punto de montaje dentro del contenedor con los permisos deseados. El proceso se basa en crear un fichero Dockerfile donde se define el usuario y los permisos del directorio que monta el volumen. Una vez se monte el volumen, ya sea desde la linea de comandos o docker-compose heredará los permisos y propietario definidos previamente en la imagen. No es necesario que el usuario exista en el host, puede perfectamente solo existir en el contenedor.
En el ejemplo se crea una imagen docker llamada alpine_volumen que usará un usuario no privilegiado “testuser”.
ARG USR=testuser FROM alpine RUN addgroup -S $USR && adduser -S $USR -G $USR # Se crea el usuario y el grupo para luego aplicarlo al punto de montaje del volumen. RUN mkdir /VOL_testuser && chown $USR:$USR /VOL_testuser # Se crea el directorio donde será montado el volumen y su propietario VOLUME /VOL_testuser # Se hace una referencia al volumen que será montado desde linea de comando o docker-compose. USER $USR # Usuario del proceso.
Linea de comando (se creará el volumen XXXX si no existe).
docker run --rm -it -v XXXX:/VOL_testuser alpine_volumen
Montar el volumen desde docker-compose, el volumen se crea automáticamente si no existe. El contenedor creado solo ejecutará una shell.
version: "3" services: web: image: alpine_volumen # Imagen creada a partir del Dockerfile mostrado anteriormente. stdin_open: true # docker run -i tty: true # docker run -t command: /bin/sh volumes: - XXXX:/VOL_testuser # El volumen será montado como el usuario testuser. volumes: XXXX:
Montar directorios conociendo el usuario del contenedor y aplicándolo al directorio host
Obtener el id del usuario que corre en el contenedor
# docker docker exec XXXX id uid=100(testuser) gid=101(testuser) groups=101(testuser) # docker-compose docker-compose ps --services web docker-compose exec web id uid=100(testuser) gid=101(testuser) groups=101(testuser)
Una vez se conoce el usuario y grupo, se puede usar en el host el comando chown y chmod. Por supuesto el usuario debe existir en el host.
Montar directorios conociendo el usuario del directorio del host y aplicándolo al contenedor
Se crea un fichero .env con el usuario y grupo del directorio se sabe se va a montar en el contenedor.
UID=100 GID=101
En el fichero de docker-compose se define el usuario y grupo que debe correr el proceso apra que sea compatible con el directorio montado
version: "3" services: web: image: alpine_volumen user: "${UID}:${GID}" stdin_open: true # docker run -i tty: true # docker run -t command: /bin/sh volumes: - /home/XXXX:/DIR_testuser
Aplicar la configuración de propietario y permisos en el ENTRYPOINT
Se aplica la configuración dentro del ENTRYPOINT. Normalmente se usará un script, pero para el ejemplom se ha usado un comando y una shell como proceso final.
web: image: alpine stdin_open: true # docker run -i tty: true # docker run -t container_name: test volumes: - /home/XXXX:/DIR_testuser entrypoint: /bin/sh -c "adduser -D testuser && chown -Rv testuser:testuser /DIR_testuser && sh"