Alterar permissões para volumes nomeados no Docker

Eu Tenho o contêiner Docker com o volume nomeado em execução no usuário não raiz iniciado com o seguinte comando:

docker run -v backup:/backup someimage

Na imagem, há um script de backup que está tentando salvar arquivos em /backup diretório, mas falha. Montado backup volume em /backup dir pertence ao usuário root.

Como alterar permissões para /backup directório?

----- EDIT1:

mcve abaixo:

Execute o contêiner docker com Gerrit:

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

Agora, em outra janela do terminal, tente salvar algo em /backup Directorio:

docker exec gerrit touch /backup/testfile

Você vai ter:

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

Os volumes nomeados são inicializados quando criados pela primeira vez para o conteúdo da imagem no local de montagem. Essa inicialização inclui o proprietário e as permissões. Se /backup não existe em sua imagem, então um diretório vazio será criado e de propriedade da raiz. Você pode:

Opção 1: Crie o diretório em seu Dockerfile com a propriedade e permissões apropriadas:

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

Observe que isso só funciona quando o volume nomeado de backup ainda não existe ou está vazio. E precisa ser um volume nomeado, não um volume host.

Opção 2: Inicialize o volume nomeado, incluindo algum conteúdo dentro do volume (um arquivo vazio funcionaria) usando outro contêiner temporário:

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

Opção 3: Ajuste as permissões após a montagem do volume, exigindo raiz dentro do contêiner:

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

Solução de trabalho aqui. Docker em configurações padrão mantém volumes de dados em /var/lib/docker/volumes/. Baseando-se no exemplo de arquivos de perguntas de backupgerrit o volume nomeado é mantido em /var/lib/docker/volumes/backupgerrit/_data. Dir essencial é _data e suas permissões. Neste exemplo, o contêiner Gerrit usa um usuário com id 1000. A solução é definir a propriedade disso _data dir para 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/

E é assim que parece do lado do contêiner:

# 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

Permissões de _data dir são persistentes até remover o volume com

# docker volume rm backupgerrit