182 votes

Docker, monter les volumes en lecture seule

Je travaille avec Docker, et je veux monter un dossier dynamique qui change beaucoup (afin de ne pas devoir créer une image Docker pour chaque exécution, ce qui serait trop coûteux), mais je veux que ce dossier soit en lecture seule. Changer le propriétaire du dossier fonctionne. Cependant, chown nécessite l'accès root, que je préférerais ne pas exposer à une application.

Quand j'utilise le drapeau -v pour monter, il attribue n'importe quel nom d'utilisateur que je donne, j'ai créé un utilisateur non-root à l'intérieur de l'image Docker, cependant, tous les fichiers dans le volume avec le propriétaire étant l'utilisateur ayant exécuté Docker, changent en l'utilisateur que j'ai donné à partir de la ligne de commande, donc je ne peux pas rendre les fichiers et dossiers en lecture seule. Comment puis-je empêcher cela ?

J'ai également ajouté mustafa ALL=(docker) NOPASSWD: /usr/bin/docker, afin de pouvoir changer vers un autre utilisateur via le terminal, mais malgré tout, les fichiers ont des permissions pour mon utilisateur.

256voto

Alp Points 10727

Vous pouvez spécifier qu'un volume doit être en lecture seule en ajoutant :ro à l'option -v:

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

Notez que le dossier est alors en lecture seule dans le conteneur et en lecture-écriture sur l'hôte.

Édition 2018

Conformément à la documentation sur l'utilisation des volumes, il existe maintenant une autre façon de monter des volumes en utilisant l'option --mount. Voici comment l'utiliser avec la lecture seule:

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

docker-compose

Voici un exemple sur la façon de spécifier des conteneurs en lecture seule dans docker-compose:

version: "3"
services:
  redis:
    image: redis:alpine
    read_only: true

92voto

Denis Stafichuk Points 158

Docker-compose

Voici une manière appropriée de spécifier un volume en lecture seule dans docker-compose :

Syntaxe longue

version: "3.2" # Utiliser la version 3.2 ou supérieure
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/compose-file-v3/#long-syntax-3

Syntaxe courte

Ajouter :ro à la définition du montage du volume :

version: "3.0" # Utiliser la version 3.0 ou supérieure
services:
  my_service:
    image: my:image
    volumes:
      - /path/on/host:/path/inside/container:ro

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

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X