Compose: Docker Compose mountet benannte Volumes ausschließlich als 'root'

Erstellt am 5. Apr. 2016  ·  33Kommentare  ·  Quelle: docker/compose

Es geht um benannte Volumes (also kein "Datenvolumen-Container", kein "Volumes-from") und docker-compose.yml.

Das Ziel hier ist es, docker-compose zu verwenden, um zwei Dienste 'appserver' und 'server-postgresql' in zwei separaten Containern zu verwalten und die Funktion "volumes:" docker-compose.yml zu verwenden, um Daten aus dem Dienst 'server-postgresql' persistent zu machen .

Das Dockerfile für 'server-postgresql' sieht so aus:

FROM        ubuntu:14.04
MAINTAINER xxx

RUN apt-get update && apt-get install -y [pgsql-needed things here]
USER        postgres
RUN         /etc/init.d/postgresql start && \
            psql --command "CREATE USER myUser PASSWORD 'myPassword';" && \
            createdb -O diya diya
RUN         echo "host all  all    0.0.0.0/0  md5" >> /etc/postgresql/9.3/main/pg_hba.conf
RUN         echo "listen_addresses='*'" >> /etc/postgresql/9.3/main/postgresql.conf
CMD         ["/usr/lib/postgresql/9.3/bin/postgres", "-D", "/var/lib/postgresql/9.3/main", "-c", "config_file=/etc/postgresql/9.3/main/postgresql.conf"]

Adn sieht die docker-compose.yml so aus:

version: '2'
services:
    appserver:
        build: appserver
        depends_on:
            - server-postgresql
        links:
            - "server-postgresql:serverPostgreSQL"
        ports:
            - "1234"
            - "1235"
        restart: on-failure:10
    server-postgresql:
        build: serverPostgreSQL
        ports:
            - "5432"
        volumes:
            - db-data:/volume_data
        restart: on-failure:10
volumes:
    db-data:
        driver: local

Dann starte ich alles mit docker-compose up -d , betrete meinen Server-Postgresql-Container mit docker-compose exec server-postgresql bash , ein schnelles ls enthüllt /volume_data , dann cd hinein und versuche es mit touch testFile und habe "Berechtigung verweigert. Was normal ist, weil ein schnelles ls -l zeigt, dass volume_data im Besitz von root:root .

Da ich jetzt USER postgres im Dockerfile habe, bin ich beim Ausführen von docker-compose exec als Benutzer 'postgres' angemeldet (und der Postgresql-Daemon läuft als Benutzer 'postgres' auch nicht in der Lage sein, in /volume_data zu schreiben).
Dies bestätigt wird , denn wenn ich diese laufen statt: docker-compose exec --user root server-postgresql bash und Neuversuch zu cd /volume_data und touch testFile , es funktioniert (es ist kein Berechtigungsfehler zwischen dem Host und dem Behälter, wie es ist manchmal der Fall, wenn der Container einen Host-Ordner einhängt, dies ist ein typischer Unix-Berechtigungsfehler, da /volume_data als 'root:root' gemountet wird, während der Benutzer 'postgres' versucht zu schreiben).

Es sollte also eine Möglichkeit in docker-compose.yml geben, namedvolumes als bestimmten Benutzer einzubinden, z. B.:

version: '2'
services:
    appserver:
        [...]
    server-postgresql:
        [...]
        volumes:
            - db-data:/volume_data:myUser:myGroup
        [...]
volumes:
    db-data:
        driver: local

Die einzige _schmutzige_ Problemumgehung, die mir einfällt, besteht darin, die USER posgres Direktive aus der Dockerfile zu entfernen und den ENTRYPOINT so zu ändern, dass er auf eine benutzerdefinierte "init_script.sh" zeigt (die als 'root' ausgeführt würde, da ich USER postgres ), würde dieses Skript die Berechtigungen von /volume_data ändern, sodass 'postgres' darauf schreiben kann, dann su postgres und den postgresql-Daemon (im Vordergrund) ausführen. Aber das ist eigentlich sehr schmutzig, weil es das Dockerfile und docker-compose.yml auf nicht standardmäßige Weise verknüpft (Laufzeit ENTRYPOINT würde sich darauf verlassen, dass ein gemountetes Volume von docker-compose.yml bereitgestellt wird).

arevolumes statu0-triage

Hilfreichster Kommentar

Eigentlich komme ich mit Neuigkeiten hierher, es scheint, dass das, was ich erreichen möchte, machbar ist, aber ich weiß nicht, ob dies ein Feature oder ein Fehler ist. Deshalb habe ich mich geändert:

In meinem Dockerfile habe

# ...
RUN    mkdir /volume_data
RUN   chown postgres:postgres /volume_data

USER postgres
# ...

Dies bewirkt, dass ein Verzeichnis /volume_data erstellt und seine Berechtigungen geändert werden, damit der Benutzer 'postgres' darauf schreiben kann.
Dies ist der Dockerfile- Teil.

Jetzt habe ich nichts an der docker-compose.yml geändert : also erstellt directory_name_db-data und mountet es auf /volume_data und die Berechtigungen sind bestehen geblieben! .
Das bedeutet, dass ich jetzt mein Named Volume im _pre-existing_ Verzeichnis /volume_data mit den erhaltenen Berechtigungen gemountet habe, damit 'postgres' darauf schreiben kann.

Ist dies also das beabsichtigte Verhalten oder eine Sicherheitsverletzung? (In diesem Fall dient es mir jedoch!)

Alle 33 Kommentare

Ich glaube nicht, dass dies von der Docker-Engine unterstützt wird, daher können wir es in Compose erst dann unterstützen, wenn es der API hinzugefügt wird. Ich glaube jedoch nicht, dass es notwendig ist, diese Funktion hinzuzufügen. Sie können die Dateien immer dem richtigen Benutzer zuordnen:

version: '2'
services:
  web:
    image: alpine:3.3
    volumes: ['random:/path']

volumes:
  random:
$ docker-compose run web sh
/ # touch /path/foo
/ # ls -l /path
total 0
-rw-r--r--    1 root     root             0 Apr  5 16:11 foo
/ # chown postgres:postgres /path/foo
/ # ls -l /path
total 0
-rw-r--r--    1 postgres postgres         0 Apr  5 16:11 foo
/ # 
$ docker-compose run web sh
/ # ls -l /path
total 0
-rw-r--r--    1 postgres postgres         0 Apr  5 16:11 foo

Das Problem, mit dem Sie konfrontiert sind, betrifft die Initialisierung eines benannten Volumes. Dies wird zugegebenermaßen nicht von Compose behandelt (weil es etwas außerhalb des Geltungsbereichs liegt), aber Sie können leicht das Docker-Cli verwenden, um ein benanntes Volume zu initialisieren, bevor Sie docker-compose up ausführen.

Ich war mir in der Tat nicht sicher, ob dies ein Docker- oder ein Compose-Problem war, sorry, wenn ich es falsch abgelegt habe.
Ist dies ein Plan in der Docker-API, sollte ich dort ein Problem melden?

Ich verstehe die Möglichkeit, sich manuell in den Container einzuloggen und chown das Volume an den Benutzer 'postgres' zu übergeben. Aber in meinem Fall verwende ich Compose, damit ich sofort neue Container für neue Clients instanziieren kann ( docker-compose -p client_name up ) und Compose erstellt ein benutzerdefiniertes Netzwerk client_name_default , es erstellt die Container mit den Namen client_name _appserver_1 und client_name _server-postgresql_1 und _noch wichtiger_ wird das Volume client_name_db-data . All das muss ich nicht manuell tun, damit es von dem Skript ausgeführt werden kann, das die Client-Registrierung verarbeitet.

Mit der von Ihnen beschriebenen Lösung (_manuell_ "logging" im Container mit sh und chown -ing der Datenträgerbezeichnung) kann ich kein einfaches Verfahren zum Hinzufügen neuer Clients haben, und dies muss von Hand gepflegt werden.

Aus diesem Grund denke ich, dass diese Funktion implementiert werden sollte. In der Docker-API können wir beim Mounten eines Volumes ro oder rw (für schreibgeschützte oder schreibgeschützte) Berechtigungen angeben. Ich denke, wir sollten in der Lage sein, user:group anzugeben.

Was meint ihr, macht meine Bitte Sinn?

Eigentlich komme ich mit Neuigkeiten hierher, es scheint, dass das, was ich erreichen möchte, machbar ist, aber ich weiß nicht, ob dies ein Feature oder ein Fehler ist. Deshalb habe ich mich geändert:

In meinem Dockerfile habe

# ...
RUN    mkdir /volume_data
RUN   chown postgres:postgres /volume_data

USER postgres
# ...

Dies bewirkt, dass ein Verzeichnis /volume_data erstellt und seine Berechtigungen geändert werden, damit der Benutzer 'postgres' darauf schreiben kann.
Dies ist der Dockerfile- Teil.

Jetzt habe ich nichts an der docker-compose.yml geändert : also erstellt directory_name_db-data und mountet es auf /volume_data und die Berechtigungen sind bestehen geblieben! .
Das bedeutet, dass ich jetzt mein Named Volume im _pre-existing_ Verzeichnis /volume_data mit den erhaltenen Berechtigungen gemountet habe, damit 'postgres' darauf schreiben kann.

Ist dies also das beabsichtigte Verhalten oder eine Sicherheitsverletzung? (In diesem Fall dient es mir jedoch!)

Ich glaube, dies wurde in Docker 1.10.x hinzugefügt, damit benannte Volumes aus dem ersten Container initialisiert werden, der sie verwendet. Ich denke, es ist erwartetes Verhalten.

Ich mache auch benannte Volumes, bei denen der Besitz in der Dockerfile festgelegt ist, und in Compose füge ich user: postgres sodass sogar PID 1 einem Nicht-Root-Benutzer gehört.

Docker-compose für volumes hat driver_opts , um Optionen bereitzustellen.
Es wird sehr gut sein, dort Optionen wie chmod , chown sogar für den Fahrer local .
Und vor allem möchte ich, dass es auch für lokal erstellte Hostverzeichnisse angewendet wird, wenn es beim Start nicht vorhanden ist.

Hat jemand bereits ein Problem zum Moby-Projekt geöffnet?

Die Antwort von @dnephin funktioniert nicht. Das Problem besteht darin, dass wir den Container als Standardbenutzer ausführen, die Befehle chown oder chmod fehlschlagen, das Volume im Besitz von Root ist und ein Standardbenutzer die Berechtigungen nicht ändern kann.

@jcberthon Die vorgeschlagene Methode besteht darin, den Container mit root als USER NACH dem chown/chmod zu verwenden, so dass er im Grunde "Privilegien verwirft".

Das ist in Ordnung, wenn Sie die Kontrolle über das Docker-Image haben, aber wenn Sie vorhandene Images verwenden, ist dies nicht wirklich eine Option.

@dragon788 und @micheljung , ich habe mein Problem gelöst.

Eigentlich war das eigentliche Problem, dass ich in meinem Dockerfile ein VOLUME deklarierte und dann den Besitz und die Berechtigungen der Dateien in diesem Volume änderte. Diese Änderungen gehen verloren. Durch einfaches Verschieben der VOLUME Deklaration an das Ende des Dockerfiles (oder Entfernen, da optional) ist mein Problem gelöst. Die Berechtigungen sind korrekt.

Der Fehler war also:

FROM blabla
RUN do stuff
VOLUME /vol
RUN useradd foo && chown -R foo /vol
USER foo
CMD ["blabla.sh"]

Die chown im obigen Beispiel-Dockerfile gehen während des Builds verloren, weil wir VOLUME davor deklarieren. Beim Ausführen des Containers kopiert dockerd innerhalb des benannten Volumes den Inhalt von /vol vor der VOLUME Deklaration (also mit Root-Berechtigungen). Daher können die laufenden Prozesse keine Berechtigungen ändern oder ändern, so dass selbst das Erzwingen von chown im blabla.sh-Skript nicht funktionieren kann.

Durch Ändern der Datei in:

FROM blabla
RUN do stuff
RUN useradd foo && chown -R foo /vol
USER foo
VOLUME /vol
CMD ["blabla.sh"]

das Problem ist gelöst.

@jcberthon könnten Sie bitte teilen, wie Sie Ihr Volume /vol mit dem Hostsystem in Ihrer docker-compose.yml binden?

Ich arbeite mit Docker auf Fedora (also SELinux aktiviert) und keine der oben genannten Methoden hat bei mir funktioniert. Idealerweise möchte ich Anwendungen in meinen Containern im Kontext eines Benutzers (kein Root) ausführen, aber dieses Volume-Problem blockiert dies.

Die einzige Problemumgehung, die für mich funktioniert, besteht darin, meinen Anwendungsbenutzer zu eliminieren und alles als Root-Benutzer auszuführen/zu besitzen.

Hallo @renanwilliam und @egee-irl

Ich verwende die oben genannte Lösung auf mehreren Betriebssystemen inkl. Fedora 26 und CentOS 7 beide mit erzwungenem SELinux, Ubuntu 16.04, 17.10 und Raspbian 9, alle drei mit aktiviertem AppArmor (mit einer Mischung aus amd64- und armhf-Plattformen).

Also, wie gesagt, ich habe jetzt die VOLUME ... Deklaration an das Ende meiner Dockerfile verschoben, aber Sie können sie alle zusammen entfernen, sie wird nicht benötigt. Was ich normalerweise auch mache, ist die Benutzer-ID beim Anlegen des Benutzers im Dockerfile zu korrigieren (zB useradd -u 8002 -o foo ). Dann kann ich diese UID einfach auf dem Host wiederverwenden, um dem Ordner die richtigen Berechtigungen zu erteilen.

Der nächste Schritt besteht also darin, den "Anhänger" des Verzeichnisses /vol auf dem Host zu erstellen, sagen wir, es ist /opt/mycontainer1/vol , also ist das

$ sudo mkdir -p /opt/mycontainer1/vol
$ sudo chown -R 8002 /opt/mycontainer1/vol
$ sudo chmod 0750 /opt/mycontainer1/vol

Wenn der Container dann als Benutzer foo ausgeführt wird, kann er in das Verzeichnis /opt/mycontainer1/vol schreiben. Etwas wie:

$ sudo -u docker-adm docker run --name mycontainer1 -v /opt/mycontainer1/vol:/vol mycontainer1-img

Auf SELinux-basierten Hosts möchten Sie möglicherweise die Option :z :Z für das Volume hinzufügen, damit Docker den Ordner entsprechend markiert. Der Unterschied zwischen z und Z besteht darin, dass die Kleinbuchstaben z das Volume markieren, sodass möglicherweise allen Containern dieses Hosts von SELinux der Zugriff auf dieses Verzeichnis ermöglicht wird (aber offensichtlich nur wenn Sie es an einen anderen Container binden), während die Großbuchstaben Z es so kennzeichnen, dass nur dieser bestimmte Container auf das Verzeichnis zugreifen kann. Auf Fedora mit SELinux möchten Sie es vielleicht versuchen:

$ sudo -u docker-adm docker run --name mycontainer1 -v /opt/mycontainer1/vol:/vol:Z mycontainer1-img

Update : Sie können mein Repo hier überprüfen https://github.com/jcberthon/unifi-docker Ich verwende diese Methode und erkläre, wie Sie den Host konfigurieren und Ihren Container ausführen. Ich hoffe, dies kann Ihnen helfen, Ihre Probleme zu lösen.

Übrigens, ich entschuldige mich bei @renanwilliam für die lange Verzögerung bei der Beantwortung. Ich habe am Ende des Jahres nicht viel Freizeit...

Also, lange Rede, kurzer Sinn für Ungeduldige:

RUN mkdir /volume_data
RUN chown postgres:postgres /volume_data

Das Erstellen des Volume-Verzeichnisses im Voraus und ein chown löst das Problem, da das Volume die Berechtigungen des bereits vorhandenen Verzeichnisses beibehält.

Dies ist eine schlechte Lösung, da es nicht offensichtlich ist (Chown in einem Dockerfile ausführen und dann dieses Eigentum während des Mountens erben). Die Freigabe der Eigentümer- und Gruppensteuerung in der Docker-Compose- und Docker-CLI wäre für Befehle im Unix-Stil der am wenigsten überraschende Weg.

@villasv

Ein kleiner Tipp: Führen Sie die 2 RUN ... zu einem zusammen, dies vermeidet das Erstellen zusätzlicher Ebenen und ist eine bewährte Methode. Also sollten deine 2 Zeilen sein

RUN mkdir /volume_data && chown postgres:postgres /volume_data

Aber Vorsicht (wie ich oben in einem Kommentar erwähnt habe), dass Sie den obigen Befehl RUN ... ausführen müssen, bevor Sie das Volume mit VOLUME ... deklarieren (oder das Volume tatsächlich nicht deklarieren). Wenn Sie (wie ich) den Eigentümerwechsel nach der Deklaration des Volumens vornehmen, werden diese Änderungen nicht aufgezeichnet und gehen verloren.

@colbygk es wäre zwar praktisch, aber so funktioniert Linux nicht. Docker verwendet den Linux-Mount-Namespace, um verschiedene Einzelverzeichnishierarchien ( / und Unterordner) zu erstellen, aber AFAIK gibt es derzeit keine Benutzer-/Gruppenzuordnungen oder Berechtigungen, die im Linux-Mount-Namespace überschreiben. Diese "Mounts" in einem Container (und dazu gehören Bind-Mount-Volumes) befinden sich auf einem Dateisystem auf dem Host (es sei denn, Sie verwenden natürlich andere Docker-Volume-Plugins), und dieses Dateisystem respektiert die Linux-VFS-Schicht, die alles macht die Dateiberechtigungsprüfung. Auf dem Host könnte sogar ein MAC (zB SELinux, AppArmor usw.) vorhanden sein, der den Zugriff eines Containers auf Dateien innerhalb des Containers stören könnte. Wenn Sie chroot tun, können Sie auf ähnliche Probleme stoßen, da Sie Mount-Ordner innerhalb der Chroot binden können die Bindehalterung.

Für den Container gelten einfache Linux- (und eigentlich auch Unix-) Regeln. Der Trick besteht darin, die Möglichkeiten und Grenzen von Linux-Namespaces heute zu erkennen und zu verstehen, und dann wird klarer, wie Probleme wie dieses Problem gelöst werden können. Ich habe es vollständig mit klassischen Unix-Befehlen gelöst.

@jcberthon Vielen Dank für Ihre nachdenkliche Antwort:

Ich würde argumentieren, dass dies ein Problem sein sollte, das wie von Ihnen vorgeschlagen in die Plugin-Schicht verschoben wird und daher Teil des generischen Volume-Handler-Plugins werden könnte, das mit Docker geliefert wird. Es scheint mir sehr uncloud/container zu sein, eine externe Ressource (außerhalb eines bestimmten Containers) zu zwingen, im Wesentlichen statische Beziehungen einzuhalten, die in dem Image definiert sind, von dem ein Container abgeleitet ist.

Es gibt andere Beispiele für diese genaue Art von UID/GID-Mapping, die in anderen ähnlichen Bereichen von "Unix" auftritt:

Bitte korrigieren Sie mich, wenn ich falsch liege; https://github.com/zfsonlinux/zfs/issues/4177 scheint vom "Führer von LXC/LXD" als ein Problem im Zusammenhang mit ZFS unter Linux entstanden zu sein, das UID/GID-Informationen nicht korrekt bereitstellt, um eine Zuordnung dieser in ein zu ermöglichen Container fast so _exakt_, wie wir es hier besprechen. Wenn man sich https://github.com/zfsonlinux/zfs/issues/4177 genau ansieht, scheint es, dass der Volume-Typ zfs diese uid/gid-Zuordnung zwischen Namespaces tatsächlich bereits unterstützen könnte, aber die Steuerelemente dafür nicht verfügbar macht.

Die meisten Leute, die Docker verwenden, ist für dev / CI, wir verwenden "generische" Images wie php/nginx (runner) oder gradle/python (builder), sodass eine gute Lösung:

  1. Dockerfile muss nicht erstellt/bearbeitet werden, um das Image zu überschreiben
  2. Verwenden Sie eine einfache Syntax in der docker-compose yml-Datei

Da wir die Schreibberechtigung eines Volumes (X:X:OPTION_READ_WRITE) leicht festlegen können, wie wäre es mit dem Hinzufügen des Eigentümers auf die gleiche Weise?

SOURCE:TARGET:RW:OWNER

Ich habe das gleiche Problem. Es gibt wahrscheinlich eine bewährte Methode, und meine Methode ist _nicht_:

version: '3.5'
services:
    something:
        image: someimage
        user: '1000'
        expose:
            - 8080
        volumes:
            - dev:/app

volumes:
    dev:

Dies verursacht EACCES: permission denied, access '/app' .

Wie sollen wir das machen? Dh ein neues Volume definieren und mit einem Nicht-Root-Benutzer darauf zugreifen können?

Hallo @Redsandro

Es wäre besser, wenn Sie im someimage Docker-Image die UID auf 1000 für /app . Oder wenn Sie dies nicht kontrollieren können, sollten Sie für user: ... in Ihrer Compose-Datei die UID oder GID verwenden, die vom Autor des Bildes beabsichtigt wurde.

Wenn der Autor des Images die UID 0 verwendet hat und Sie den Dienst nicht als Root ausführen möchten (und er kann als unprivilegierter Benutzer ausgeführt werden), wenden Sie sich natürlich an den Docker-Image-Autor.

Da dies nicht von Docker verwaltet werden muss, können Sie einen anderen Container erstellen, um Ihre Volumes bereitzustellen, bevor die zugehörigen Container beginnen, z. B. mit https://hub.docker.com/r/hasnat/volumes-provisioner

version: '2'
services:
  volumes-provisioner:
    image: hasnat/volumes-provisioner
    environment:
      PROVISION_DIRECTORIES: "65534:65534:0755:/var/data/prometheus/data"
    volumes:
      - "/var/data:/var/data"

  prometheus:
    image: prom/prometheus:v2.3.2
    ports:
      - "9090:9090"
    depends_on:
      - volumes-provisioner
    volumes:
      - "/var/data/prometheus/data:/prometheus/data"

Ich verstehe nicht, warum Docker dieses Problem nicht repariert, ich stimme zu, dass wir es für Entwicklungszwecke hacken können, aber in der Produktion auf keinen Fall!

IMHO podman kann als (unprivilegierter) Benutzer laufen (siehe auch hier ) und wird dies wahrscheinlich lösen. Jemand arbeitet auch an einer Compose-Lösung und die Podman-API ist in den meisten Teilen absichtlich kompatibel zu Docker.

[podman] könnte hier jedoch einigen Leuten helfen, da es in großen Teilen mit Docker kompatibel ist.

Stimme voll und ganz zu, leider funktioniert Podman nicht auf dem Mac

Stimme voll und ganz zu, leider funktioniert Podman nicht auf dem Mac


Nun, IMHO werden weder Docker noch Podman niemals nativ funktionieren. Aber Docker-Installationen unter OS/X verstecken das Zeug der virtuellen Maschine sehr gut.
Aber ich stimme zu, dass das manuelle Einrichten von VMs für ein richtiges Entwicklungssystem schmerzhaft sein kann.
Hier kommt es allerdings etwas vom Thema ab.

Ich bin kein OS/X-Benutzer mehr, aber ich habe gerade gesehen, dass es einen _experimentellen_ podman dmg gibt .

Ich vermute, dass sich in naher Zukunft ein ähnliches Ökosystem entwickeln könnte, da es bereits möglich ist, auf podman programmatisch oder sogar auf podman-compose zuzugreifen .

Dies wird insbesondere dann zu einem Problem, wenn Benutzer ohne Sudo-Rechte auf einem freigegebenen Cluster versehentlich einige Ordner erstellen, die Root über docker-compose gehören, und diese Ordner dann nicht einmal selbst löschen können.

Ich bin auch auf dieses Problem gestoßen. Wir versuchen, docker in jpetazzos Beitrag beschrieben .

Wir möchten diesen Container aus der docker-compose-Datei starten und in der Lage sein, den Docker-Socket vom Host-Computer in den Container-Computer unter der Docker-Gruppe zu mounten. Dies ist so, dass wir einen anderen Benutzer als root verwenden können, um Docker aus dem Container heraus auszuführen.

Da ich den Besitz und die Berechtigung von Bind-Mount-Dateien nicht angeben kann, ist dies derzeit nicht möglich.

Geben Sie hier meine zwei Cent ein:

Für eine "native" Docker-Compose-Lösung habe ich dies getan, da die meisten Leute alpine bereits in ihrer Bildbibliothek haben:

volumes:
  media:
services:
  mediainit:
    image: alpine
    entrypoint: /bin/sh -c "chown -v nobody:nogroup /mnt/media && chmod -v 777 /mnt/media"
    container_name: mediainit
    restart: "no"
    volumes: 
      - "media:/mnt/media"

Natürlich nicht die sicherste Methode, aber nur Container, denen Berechtigungen für den Container gewährt werden, werden es sehen, also ist es keine große Sache, aber Sie könnten es leicht zu chown user:user machen oder etwas Setacl-Fantasie machen, wenn Ihr Kernel unterstützt es.

BEARBEITEN: Anscheinend müssen Sie den Ordner zuerst vor chmod chown oder er "klebt" nicht, zumindest in meinen Tests.

Der Besitz von Volumes unterliegt nicht der Kontrolle von docker-compose, daher sollte diese Diskussion unter Moby Project Repo stattfinden.

Einige Hinweise für Leute, die hier nach einer Problemumgehung suchen:
Docker-Volume erhält bei der ersten Verwendung durch einen Container den ursprünglichen Inhalt und die Berechtigung, die vom Container geerbt wurden. Das heißt, Sie können Ihr Bild wie folgt konfigurieren:

#Dockerfile
FROM alpine
RUN addgroup -S nicolas && adduser -S nicolas -G nicolas
RUN mkdir /foo && chown nicolas:nicolas /foo  
# empty, but owned by `nicolas`. Could also have some initial content
VOLUME /foo  
USER nicolas

Wenn ein solches Image ohne ein explizites Volume (das absichtlich mit einer zufälligen ID erstellt wird) oder mit einem benannten Volume, das noch nicht existiert, ausgeführt wird, "verbreitet" es Berechtigungen für das Volume:

➜  docker run --rm -it -v some_new_volume:/foo myimage
/ $ ls -al /foo
total 8
drwxr-xr-x    2 nicolas  nicolas       4096 Oct 18 08:30 .
drwxr-xr-x    1 root     root          4096 Oct 18 08:30 ..

Das gleiche gilt, wenn Sie Volumes verwenden, die in einer Compose-Datei deklariert sind:

#docker-compose.yml
version: "3"
services:
  web:
    image: myimage
    command: ls -al /foo
    volumes:
      - db-data:/foo
volumes:
    db-data:

➜  docker-compose up
Creating volume "toto_db-data" with default driver
Creating toto_web_1 ... done
Attaching to toto_web_1
web_1  | total 8
web_1  | drwxr-xr-x    2 nicolas  nicolas       4096 Oct 18 08:30 .
web_1  | drwxr-xr-x    1 root     root          4096 Oct 18 08:37 ..
toto_web_1 exited with code 0

Dies funktioniert nicht, wenn Sie ein Volume erneut anhängen, das bereits von einem anderen Container verwendet wurde. Das Ändern des Volume-Eigentümers oder dessen Kontrolle zum Zeitpunkt der Erstellung muss von der Engine oder von Volume-Treibern mit einigen spezifischen Optionen implementiert werden. Andernfalls müssen Sie sich wie vorgeschlagen auf einige chown Tricks verlassen ^.

Hoffe das hilft.
Ich schließe dieses Problem, da Compose keine Kontrolle über die Volume-Erstellung hat, sondern die verfügbare Engine-API.

War diese Seite hilfreich?
0 / 5 - 0 Bewertungen