Wie ändere ich den Besitzer des VOLUME-Verzeichnisses in Dockerfile?


11

Ich habe folgendes 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

Was ich gebaut habe:

$ 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

Beim Ausführen gehört das /opt/myvolumeVerzeichnis jedoch rootnicht 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

weil es während des Laufs erstellt wird.

Ist es möglich, den Standardbesitzer des VOLUMEVerzeichnisses in zu definieren oder zu ändern Dockerfile?

Ich verwende es unter MacOS und Linux.



Antworten:


12

Wie in der Dokumentation angegeben , erbt die VOLUME-Anweisung den Verzeichnisinhalt und die im Container vorhandenen Berechtigungen, sodass Sie das Problem mit einer Docker-Datei wie der folgenden umgehen können:

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

Die Erstellung des Verzeichnisses muss als root erfolgen (um in / opt schreiben zu können).


Der Trick scheint zu spezifizieren, VOLUMEnachdem das Verzeichnis erstellt wurde: Wenn Build-Schritte die Daten innerhalb des Volumes ändern, nachdem sie deklariert wurden, werden diese Änderungen verworfen.
Jesse Glick

Die Erstellung des Verzeichnisses hat nichts damit zu tun. Ein Volume wird aus dem Container bereitgestellt, sodass alles, was vor dem Bereitstellen (Container gestartet) im Container ausgeführt wird, verworfen wird. Ich verstehe Ihren Kommentar nicht wirklich
Tensibai

2

Ich hatte ein ähnliches Problem, das hat bei mir funktioniert:

  1. Schreiben Sie eine Docker-Datei mit:

    # 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. Führen Sie die folgenden Bash-Befehle aus:

    # 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
    

Beachten Sie, dass die Namen, UIDs und GIDs für den Docker-Benutzer und den Host-Benutzer identisch sein müssen. Der letzte Bash-Befehl teilt dem Docker-Image mit, dass dieser Hostbenutzer mit dem Benutzer des freigegebenen Docker-Volume-Verzeichnisses identisch ist, sodass das Dateiverzeichnis dann dem "Testbenutzer" im Docker-Container gehört.


AUCH in einigen Umgebungen kann SELinux den Dateizugriff verhindern. Dies kann durch vorübergehende oder dauerhafte Deaktivierung von SELinux behoben werden (obwohl ich dringend von einer dauerhaften Deaktivierung abgeraten habe). Eine Anleitung dazu finden Sie hier: tecmint.com/…
CubeBot88
Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.