Cambiar permisos para volúmenes con nombre en Docker

Tengo un contenedor Docker con un volumen con nombre que se ejecuta en un usuario no root iniciado con el siguiente comando:

docker run -v backup:/backup someimage

En la imagen, hay un script de copia de seguridad que intenta guardar archivos en /backup directorio pero falla. Montar backup volumen en /backup dir pertenece al usuario root.

Cómo cambiar los permisos de /backup directorio?

----- EDIT1:

mcve abajo:

Ejecute el contenedor docker con Gerrit:

docker run -v backupgerrit:/backup --name gerrit gerritcodereview/gerrit

Ahora, en otra ventana de terminal, intente guardar algo en /backup dir:

docker exec gerrit touch /backup/testfile

Usted conseguirá:

touch: cannot touch '/backup/testfile': Permission denied

Los volúmenes con nombre se inicializan cuando se crean por primera vez en el contenido de la imagen en la ubicación de montaje. Esa inicialización incluye el propietario y los permisos. Si /backup si no existe en su imagen, se creará un directorio vacío que será propiedad de root. Usted puede:

Opción 1: Cree el directorio en su Dockerfile con la propiedad y los permisos adecuados:

FROM your-imageUSER rootRUN mkdir -p /backup \ && chown -R your-user /backupUSER your-user

Tenga en cuenta que esto solo funciona cuando el volumen de copia de seguridad con nombre aún no existe o está vacío. Y debe ser un volumen con nombre, no un volumen host.

Opción 2: Inicialice el volumen con nombre, incluido parte del contenido dentro del volumen (un archivo vacío funcionaría) utilizando otro contenedor temporal:

docker run --rm -v backupgerrit:/backup busybox \  /bin/sh -c 'touch /backup/.initialized && chown -R 1000:1000 /backup'

Opción 3: Ajuste los permisos después de montar el volumen, lo que requiere root dentro de su contenedor:

docker exec -u 0:0 your-container chown -R your-user /backup

Solución de trabajo aquí. Docker en la configuración predeterminada mantiene los datos de los volúmenes en /var/lib/docker/volumes/. Basado en un ejemplo de archivos de preguntas de backupgerrit el volumen con nombre se mantiene en /var/lib/docker/volumes/backupgerrit/_data. Esencial dir es _data y sus permisos. En este ejemplo, Gerrit Container utiliza un usuario con ID 1000. La solución es establecer la propiedad de este _data dir a 1000:1000.

# chown 1000:1000 /var/lib/docker/volumes/backupgerrit/_data# ls -ln /var/lib/docker/volumes/backupgerrit/drwxr-xr-x 2 1000 1000 4096 Feb 25 12:19 _data/

Y así es como se ve desde el lado del contenedor:

# docker psCONTAINER ID   IMAGE                     COMMAND            CREATED          STATUS          PORTS                 NAMESeaa816980be5   gerritcodereview/gerrit   "/entrypoint.sh"   31 minutes ago   Up 31 minutes   8080/tcp, 29418/tcp   gerrit# docker exec gerrit iduid=1000(gerrit) gid=1000(gerrit) groups=1000(gerrit)# docker exec gerrit ls -l / | grep backupdrwxr-xr-x   2 gerrit gerrit 4096 Feb 25 11:19 backup# docker exec gerrit touch /backup/testfile# docker exec gerrit ls -l /backuptotal 0-rw-r--r-- 1 gerrit gerrit 0 Feb 25 11:19 testfile

Permisos de _data los directorios son persistentes hasta que se elimina el volumen con

# docker volume rm backupgerrit