Come modificare il proprietario della directory VOLUME in Dockerfile?


11

Ho il seguente 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

Che l'ho costruito:

$ 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

Tuttavia, quando eseguita, la /opt/myvolumedirectory è di proprietà di root, non 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

perché è stato creato durante l'esecuzione.

È possibile definire o modificare il proprietario predefinito della VOLUMEdirectory in Dockerfile?

Lo sto eseguendo su macOS e Linux.



Risposte:


12

Come indicato nella documentazione , l'istruzione VOLUME eredita il contenuto della directory e le autorizzazioni esistenti nel contenitore, quindi è possibile aggirare il problema con un file docker come questo:

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

La creazione della directory deve essere fatta come root (per poter scrivere in / opt).


Il trucco sembra specificare VOLUMEdopo la creazione della directory: se qualche passaggio di compilazione modifica i dati all'interno del volume dopo che è stato dichiarato, tali modifiche verranno ignorate.
Jesse Glick,

La creazione di dir non è correlata, un volume verrà montato fuori dal contenitore in modo che tutto ciò che viene fatto all'interno del contenitore prima del montaggio (contenitore avviato) verrà scartato. Non capisco davvero il tuo commento
Tensibai,

2

Ho avuto un problema simile, questo ha funzionato per me:

  1. Scrivi il file Docker con:

    # 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. Esegui questi comandi 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
    

Si noti che i nomi, UID, GID devono essere gli stessi per l'utente Docker e l'utente host. L'ultimo comando bash indica all'immagine Docker che l'utente host è lo stesso dell'utente dir del volume condiviso Docker, in modo che la directory del file diventi di proprietà del "testuser" nel contenitore Docker.


Inoltre, in alcuni ambienti, SELinux può impedire l'accesso ai file. Questo può essere risolto disabilitando SELinux temporaneamente o permanentemente (anche se ho fortemente sconsigliato la disabilitazione permanente). Una guida su questo può essere trovata qui: tecmint.com/…
CubeBot88
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.