Docker, mounten Sie Volumes schreibgeschützt

106

Ich arbeite mit Docker und möchte einen dynamischen Ordner bereitstellen, der sich stark ändert (sodass ich nicht für jede Ausführung ein Docker-Image erstellen müsste, was zu kostspielig wäre), aber ich möchte, dass dieser Ordner schreibgeschützt ist . Das Ändern des Ordnereigentümers in eine andere Person funktioniert. Allerdings chownerfordert rootZugang, die ich lieber nicht zu einer Anwendung belichten.

Wenn ich das -vFlag zum Mounten verwende, wird der von mir angegebene Benutzername angegeben. Ich habe einen Nicht-Root-Benutzer im Docker-Image erstellt. Alle Dateien auf dem Volume mit dem Eigentümer als Benutzer, der Docker ausgeführt hat, werden jedoch in den Benutzer I geändert Geben Sie über die Befehlszeile, damit ich keine schreibgeschützten Dateien und Ordner erstellen kann. Wie kann ich das verhindern?

Ich habe auch hinzugefügt mustafa ALL=(docker) NOPASSWD: /usr/bin/docker, damit ich über das Terminal zu einem anderen Benutzer wechseln kann, aber die Dateien haben dennoch Berechtigungen für meinen Benutzer.

Mustafa
quelle
Ich dachte nur, ich würde hier einen Kommentar hinterlassen, der besagt, dass ein Benutzer Docker-Container genauso ausführen kann wie ihm vollen Root-Zugriff. Dies ist auch im Abschnitt Sicherheit der Docker-Dokumentation dokumentiert.
Blackclaws

Antworten:

170

Sie können festlegen, dass ein Volume schreibgeschützt sein soll, indem Sie es :roan den -vSwitch anhängen :

docker run -v volume-name:/path/in/container:ro my/image

Beachten Sie, dass der Ordner dann im Container schreibgeschützt und auf dem Host schreibgeschützt ist.

2018 Bearbeiten

Gemäß der Dokumentation zum Verwenden von Volumes gibt es jetzt eine andere Möglichkeit, Volumes mithilfe des --mountSwitches bereitzustellen. So nutzen Sie das schreibgeschützt:

$ docker run --mount source=volume-name,destination=/path/in/container,readonly my/image

Docker-Compose

Hier ist ein Beispiel für die Angabe schreibgeschützter Container in docker-compose:

version: "3"
services:
  redis:
    image: redis:alpine
    read_only: true
Alp
quelle
8
Gibt es zulässige Schreibvorgänge, aber keine Rückschreibungen auf den Host? das wäre fantastisch
Ray Foss
9
Das klingt so, als ob Sie überhaupt keine Lautstärke angeben möchten.
Alp
1
Irgendwie ... Ich mag es einfach nicht, ein Image zu erstellen, nur um Dockerfile COPY zu verwenden, oder einen separaten docker cpBefehl für einen ausgeschalteten Container zu verwenden.
Ray Foss
5
Vielleicht könnten Sie eine neue Frage dazu erstellen, in der Sie weitere Details angeben und diese hier verlinken?
Alp
Sie können auch die kurze Syntax mit Docker-Kompott verwenden, dhredis:alpine:ro
mb14
23

Docker-Compose

Hier ist eine geeignete Methode, um das schreibgeschützte Volume in anzugeben docker-compose:

version: "3.2" # Use version 3.2 or above
services:
  my_service:
    image: my:image
    volumes:
      - type: volume
        source: volume-name
        target: /path/in/container
        read_only: true
volumes:
  volume-name:

https://docs.docker.com/compose/compose-file/#long-syntax-3

Denis Stafichuk
quelle
2
Es ist in der Tat richtig, aber was hier schreibgeschützt ist, ist ein Volume, kein Container.
7онстантин Ван
Dies funktioniert nur bei mir mit version: "3.2"- Danke :)
Davey
"Im Dateiformat Version 3.2 hinzugefügt." yep
rybo111
3
Sie können auch tun - './my-file.txt:/container-readonly-file.txt:ro'unter volumes- Anmerkung der :roam Ende.
Rybo111