Docker, monter les volumes en lecture seule

107

Je travaille avec Docker et je souhaite monter un dossier dynamique qui change beaucoup (donc je n'aurais pas à 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 pour quelqu'un d'autre fonctionne. Cependant, chownnécessite un rootaccès, que je préférerais ne pas exposer à une application.

Lorsque j'utilise -vflag pour monter, cela donne quel que soit le nom d'utilisateur que je donne, j'ai créé un utilisateur non root à l'intérieur de l'image docker, cependant, tous les fichiers du volume avec le propriétaire en tant qu'utilisateur qui a exécuté docker, se transforment en l'utilisateur I donner à partir de la ligne de commande, donc je ne peux pas créer de fichiers et de dossiers en lecture seule. Comment éviter cela?

J'ai également ajouté mustafa ALL=(docker) NOPASSWD: /usr/bin/docker, afin que je puisse passer à un autre utilisateur via un terminal, mais les fichiers ont toujours des autorisations pour mon utilisateur.

Mustafa
la source
Je pensais juste que je laisserais un commentaire ici disant que permettre à un utilisateur d'exécuter des conteneurs Docker équivaut à lui donner un accès root complet. Ceci est également documenté dans la section sécurité de la documentation du docker.
Blackclaws

Réponses:

171

Vous pouvez spécifier qu'un volume doit être en lecture seule en ajoutant :roau -vcommutateur:

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.

2018 Modifier

Selon la documentation sur l' utilisation des volumes , il existe désormais un autre moyen de monter des volumes à l'aide du --mountcommutateur. Voici comment l'utiliser en lecture seule:

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

docker-composer

Voici un exemple de spécification de conteneurs en lecture seule dans docker-compose:

version: "3"
services:
  redis:
    image: redis:alpine
    read_only: true
Alp
la source
8
existe-t-il des autorisations d'écriture, mais pas de les réécrire sur l'hôte? ce serait fantastique
Ray Foss
9
On dirait que vous ne voulez spécifier aucun volume.
Alp
1
En quelque sorte ... Je n'aime pas avoir à créer une image juste pour utiliser Dockerfile COPY ou utiliser une docker cpcommande séparée sur un conteneur d'arrêt.
Ray Foss
5
Peut-être pourriez-vous créer une nouvelle question pour cela où vous fournissez plus de détails et liez-la ici?
Alp
Vous pouvez également utiliser la syntaxe courte avec docker compote, c'estredis:alpine:ro
mb14
23

docker-composer

Voici une manière appropriée de spécifier un volume en lecture seule dans 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
la source
2
C'est en effet correct, mais ce qui est en lecture seule ici est un volume, pas un conteneur.
Константин Ван
Cela ne fonctionne que pour moi avec version: "3.2"- Merci :)
Davey
"Ajouté au format de fichier version 3.2." yep
rybo111 le
3
Vous pouvez également faire - './my-file.txt:/container-readonly-file.txt:ro'sous volumes- noter le :roà la fin.
rybo111 le