Como alterar o proprietário do diretório VOLUME no Dockerfile?


11

Eu tenho o seguinte Dockerfile:

FROM ubuntu:xenial
RUN useradd -d /home/ubuntu -ms /bin/bash -g root -G sudo -p ubuntu ubuntu
WORKDIR /home/ubuntu
USER ubuntu
VOLUME /opt/myvolume

Que eu construí:

$ docker build -t vol-test .
Sending build context to Docker daemon  2.048kB
Step 1/5 : FROM ubuntu:xenial
 ---> 0b1edfbffd27
Step 2/5 : RUN useradd -d /home/ubuntu -ms /bin/bash -g root -G sudo -p ubuntu ubuntu
 ---> Using cache
 ---> d82e3ecc5fe8
Step 3/5 : WORKDIR /home/ubuntu
 ---> Using cache
 ---> ab1db29ee8bf
Step 4/5 : USER ubuntu
 ---> Using cache
 ---> 129393a35d9e
Step 5/5 : VOLUME /opt/myvolume
 ---> Running in 691a4cbd077e
Removing intermediate container 691a4cbd077e
 ---> 11bc9e9db9d3
Successfully built 11bc9e9db9d3
Successfully tagged vol-test:latest

No entanto, quando executado, o /opt/myvolumediretório pertence root, não ubuntu:

$ docker run vol-test id
uid=1000(ubuntu) gid=0(root) groups=0(root),27(sudo)
$ docker run vol-test find /opt/myvolume -ls
    66659      4 drwxr-xr-x   2 root     root         4096 Jul 18 23:02 /opt/myvolume
$ docker run -u ubuntu vol-test find /opt/myvolume -ls
    66940      4 drwxr-xr-x   2 root     root         4096 Jul 18 23:12 /opt/myvolume

porque é criado durante a execução.

É possível definir ou alterar o proprietário padrão do VOLUMEdiretório Dockerfile?

Estou executando no macOS e Linux.



Respostas:


12

Conforme declarado na documentação , a instrução VOLUME herda o conteúdo do diretório e as permissões existentes no contêiner, para que você possa solucionar o problema com um dockerfile como este:

FROM ubuntu:xenial
RUN useradd -d /home/ubuntu -ms /bin/bash -g root -G sudo -p ubuntu ubuntu
RUN mkdir /opt/myvolume  && chown ubuntu /opt/myvolume
WORKDIR /home/ubuntu
VOLUME /opt/myvolume

A criação do diretório deve ser feita como raiz (para poder escrever em / opt).


O truque parece estar especificando VOLUMEapós a criação do diretório: Se alguma etapa de compilação alterar os dados no volume após a declaração, essas alterações serão descartadas.
Jesse Glick

A criação do diretório não é relacionada, um volume será montado fora do contêiner, portanto, qualquer coisa feita dentro do contêiner antes da montagem (lançamento do contêiner) será descartada. Eu realmente não entendo o seu comentário
Tensibai

2

Eu tive um problema semelhante, isso funcionou para mim:

  1. Escreva o arquivo Docker com:

    # Create app layer:
    FROM python:3.4
    # Create app user & group "testuser" with IDs:
    RUN groupadd -r testuser --gid 1234 && useradd -d /home/testuser -ms /bin/bash -r -g testuser testuser --uid 1234
    # Create "testuser" working dir:
    WORKDIR /home/testuser
    # Make working dir known to Python    
    ENV PYTHONPATH "${PYTHONPATH}:/home/testuser"
    # Create & mount shared storage:
    RUN mkdir /var/run/testuser-storage
    VOLUME ["/var/run/testuser-storage"]
    # Start container as "testuser":
    ENV NAME testuser
    ENV HOME /home/testuser
    USER testuser
    
  2. Execute estes comandos bash:

    # Create the same user & group "testuser" with IDs on host:
    getent group testuser > /dev/null || /usr/sbin/groupadd -r testuser --gid 1234
    getent passwd testuser > /dev/null || /usr/sbin/useradd -r -g testuser -d /var/lib/testuser -s /bin/nologin testuser --uid 1234
    # Create shared storage dirs on host:
    mkdir /var/run/testuser-storage
    chown -R testuser.testuser /var/run/testuser-storage
    # Build and run "testuser" Docker image:
    docker build . -t testuser
    docker run --net host --name testuser -v /var/run/testuser-storage:/var/run/testuser-storage -d testuser
    # Change ownership of shared volume dir to the be the GID of "testuser"
    chown -R 1234:1234 /var/run/testuser-storage
    

Observe que os nomes, UIDs e GIDs devem ser os mesmos para o usuário do Docker e o usuário do host. O último comando bash informa à imagem do Docker que esse usuário host é o mesmo que o usuário dir do volume compartilhado do Docker, para que o diretório do arquivo se torne propriedade do "testuser" no contêiner do Docker.


Além disso, em alguns ambientes, o SELinux pode impedir o acesso a arquivos. Isso pode ser resolvido desativando temporariamente ou permanentemente o SELinux (embora eu tenha aconselhado fortemente contra a desativação permanente). Um guia sobre isso pode ser encontrado aqui: tecmint.com/…
CubeBot88
Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.