158 votes

Monter le répertoire hôte avec un lien symbolique à l'intérieur dans un conteneur docker

J'ai monté le conteneur avec ce paramètre :

-v /home/test/:/home/test

Dans /home/test de l'hôte, il existe un lien symbolique pointant vers un dossier /mnt/.

Mais ce lien, bien que l'on puisse voir où il pointe, semble cassé à l'intérieur du conteneur :

root@f93f72b45013:/var/www/html# cd /home/test/ 
root@f93f72b45013:/home/test# ls -lrt 
total 11956 
lrwxrwxrwx. 1 root root 40 Jul 20 15:55 file -> /mnt/mountedfile/
root@f93f72b45013:/home/test# ls -lrt file/*
ls: cannot access file/*: No such file or directory

Est-il possible de le faire dans Docker ? Je ne suis pas sûr qu'il y ait un moyen de le faire.

Je sais que je peux monter directement à l'endroit où le lien symbolique pointe, mais je me demandais juste si c'était possible.

0 votes

J'ai entendu parler de problèmes de mise en correspondance avec un /mnt qui peut être spécifique à l'hôte - le plus sûr est de l'éviter si vous le pouvez.

206voto

Kemin Zhou Points 31

Les liens symboliques sont un grand défi dans Docker. Dans votre cas, vous pouvez monter les deux répertoires :

-v /home/test/:/home/test -v /mnt/mountedfile:/mnt/mountedfile

Pour que les liens symboliques fonctionnent à l'intérieur et à l'extérieur du conteneur, ils doivent être des chemins absolus et utiliser exactement les mêmes noms.

En général, les liens symboliques ne fonctionnent pas dans Docker. Je l'ai découvert à la dure.

0 votes

Que faire si j'ai un lien symbolique créé dans Windows. Le chemin peut être c:\ (avec une lettre de lecteur, un point-virgule et une barre oblique inverse) ?

4 votes

@Eitan Quittez Windows et adoptez les systèmes linux/unix lorsque vous voulez travailler avec Docker.

0 votes

Oui. J'ai compris que Windows fonctionne avec CIF, et que NFS n'existe que sur les versions Windows Server (pourquoi la version de base n'existe que sur les serveurs Windows - seulement parce que cela coûte, et que Microsoft veut que vous payiez).

28voto

user2640621 Points 139

Une solution consiste à faire en sorte que Docker monte le fichier original, mais utilise readlink -f qui imprime l'emplacement réel du fichier. De cette façon, vous pouvez toujours faire référence à l'emplacement du lien symbolique dans votre commande, par ex.

docker run -it -v $(readlink -f /home/test/):/home/test/ ...

0 votes

Cela ne fonctionne pas - il en résulte les mêmes liens symboliques manquants.

0 votes

Sur macOS : perl -MCwd -le 'print Cwd::abs_path(shift)' "$path" (de stackoverflow.com/questions/7665/ )

12 votes

Je ne l'ai pas testé dans Docker, mais en jouant avec readlink, il semble que cela fonctionnera dans /home/test/ est un lien symbolique, mais pas si /home/test/ contient un lien symbolique.

2voto

ScorprocS Points 175

Bonjour, merci pour votre aide Dans mon cas, j'ai eu du mal à activer https sur mon application angular nginx.

docker run -p 80:80 -p 443:443 \
   --name test \
   -v /etc/letsencrypt/live/exemple.com:/etc/nginx/certs \
   -v /home/admin/nginx-default.conf:/etc/nginx/conf.d/default.conf:ro test

Ne monte pas les liens cert.pem et privkey.pem dans docker

Mais si j'utilise tous les chemins de fichiers explicitement comme ça

docker run -p 80:80 -p 443:443 \
   --name test \
   -v /etc/letsencrypt/live/example.com/cert.pem:/etc/nginx/certs/cert.pem \
   -v /etc/letsencrypt/live/example.com/privkey.pem:/etc/nginx/certs/privkey.pem \
   -v /home/admin/nginx-default.conf:/etc/nginx/conf.d/default.conf:ro test

Tout a fonctionné Je suppose que vous pourriez faire exactement la même chose avec docker-compose

0 votes

Même chose ici si je monte le répertoire entier, docker ne peut pas lire les liens symboliques, je dois lier chaque fichier pem dans docker-compose yml.

0voto

Je ne peux pas répondre à la réponse précédente mais sur un scénario similaire où j'ai besoin d'obtenir un fichier lié, la mise en place du chemin complet du fichier comme vous l'avez suggéré sur le fichier de composition a fonctionné pour moi :

  - /opt/cert/ssl/live/example.com/cert.pem:/certs/cert.pem
  - /opt/cert/ssl/live/example.com/privkey.pem:/certs/privkey.pem

Fichiers cert.pem y privkey.pem sous example.com sont tous deux des liens vers les fichiers où certbot les localise.

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