User Tools

Site Tools


permisos_y_propietarios_en_volumenes_con_docker-compose

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"
permisos_y_propietarios_en_volumenes_con_docker-compose.1621640041.txt.gz · Last modified: 2021/05/22 01:34 by busindre