Est-ce que quelqu'un sait comment monter un partage nfs dans un conteneur Docker avec une image de base centos? J'ai essayé cette commande:
mount server:/dir /mount/point
et a l'erreur suivante:
mount.nfs: rpc.statd is not running but is required for remote locking.
mount.nfs: Either use '-o nolock' to keep locks local, or start statd.
mount.nfs: an incorrect mount option was specified
lorsque j'essaie de l'utiliser avec l'option - o nolock, l'erreur est la suivante:
mount.nfs: Operation not permitted
Pour utiliser mount
, vous aurez besoin du CAP_SYS_ADMIN
capacité, supprimée par Docker lors de la création du conteneur.
Il y a plusieurs solutions pour cela:
--cap-add sys_admin
drapeau. Cela force Docker à conserver le CAP_SYS_ADMIN
capacité, qui devrait vous permettre de monter un partage NFS à partir du conteneur. Cela pourrait être un problème de sécurité; ne le faites pas dans des conteneurs non fiables. [Une version précédente de cette réponse suggérait d'utiliser le --privileged=true
pour conserver toutes les capacités , grâce à @earcam pour la suggestion d’utiliser --cap-add
au lieu].Montez le partage NFS sur l'hôte et transmettez-le au conteneur en tant que volume hôte:
you@Host > mount server:/dir /path/to/mount/point
you@Host > docker run -v /path/to/mount/point:/path/to/mount/point
Utilisez un plugin de volume Docker (comme le plugin Netshare ) pour monter directement le partage NFS en tant que volume conteneur:
you@Host > docker run \
--volume-driver=nfs \
-v server/dir:/path/to/mount/point \
centos
À partir du menu 17.06, vous pouvez monter des partages NFS sur le conteneur directement lorsque vous l'exécutez, sans nécessiter de fonctionnalités supplémentaires.
export NFS_VOL_NAME=mynfs NFS_LOCAL_MNT=/mnt/mynfs NFS_SERVER=my.nfs.server.com NFS_SHARE=/my/server/path NFS_OPTS=vers=4,soft
docker run --mount \
"src=$NFS_VOL_NAME,dst=$NFS_LOCAL_MNT,volume-opt=device=:$NFS_SHARE,\"volume-opt=o=addr=$NFS_SERVER,$NFS_OPTS\",type=volume,volume-driver=local,volume-opt=type=nfs" \
busybox ls $NFS_LOCAL_MNT
Vous pouvez également créer le volume avant le conteneur:
docker volume create --driver local \
--opt type=nfs --opt o=addr=$NFS_SERVER,$NFS_OPTS \
--opt device=:$NFS_SHARE $NFS_VOL_NAME
docker run --rm -v $NFS_VOL_NAME:$NFS_LOCAL_MNT busybox ls $NFS_LOCAL_MNT
Vous avez la suggestion de https://github.com/moby/moby/issues/28809
En ce qui concerne la deuxième option répertoriée dans la réponse acceptée, je ne sais pas si vous avez réellement essayé d’utiliser le "docker run -v"
commande pour transmettre un partage NFS sur le conteneur Host to docker en tant que volume. J'ai récemment essayé de le faire, voici l'information sur le partage nfs sur l'hôte:
nfs-server:/path_to_mount on /path_dest type nfs
et alors:
docker run -it -v /path_dest:/path_in_docker docker_name bash
Mais le démon docker rapporte toujours l'erreur ci-dessous:
docker: Error response from daemon: stat /path_dest: permission denied.
Après de nombreuses recherches, j'ai constaté que l'erreur venait en réalité du démon docker, qui s'exécute en tant que "racine" . Lorsque docker exécute un conteneur avec un volume à monter, il demande au démon de docker de le monter. Le problème est que le serveur NFS gérera "root" différemment. Par défaut, le serveur NFS mappera la "racine" sur "personne" , provoquant le message d'erreur: référence
Je monte le nfs sur le conteneur Docker, merci pour @helmbert.
Exécutez un conteneur Docker avec le --privileged=true
drapeau.
$ docker run -it --privileged=true centos:7 bash
[root@f7915ae635aa /]# yum install -y nfs-utils
Installez le package d’outils nfs et montez nfs sur CentOS.
[root@f7915ae635aa /]# yum install -y nfs-utils
[root@f7915ae635aa /]# mount -t nfs example.tw:/target/ /srv -o nolock
Afficher le montage du serveur nfs.
[root@f7915ae635aa /]# showmount example.tw
Hosts on example.tw:
10.10.10.1
10.10.10.2
En ajoutant --cap-add sys_admin
signaler au conteneur client ne me suffisait pas. J'avais une erreur:
mount.nfs: mount(2): Permission denied
mount.nfs: access denied by server while mounting 1.2.3.4:/exports
Après des heures de recherche, j’ai trouvé que cela ressemblait à un privilège complet --privileged
est nécessaire pour monter correctement à l'intérieur du conteneur docker.
N'oubliez pas non plus d'installer les packages du client nfs nécessaires dans votre conteneur Docker. Sur les conteneurs basés sur Debian:
apt-get install -y nfs-common