Comment faire apparaître un dossier avec lien symbolique en tant que dossier normal

38

J'ai deux applications de fléchettes que je dois dockerize. Ces deux applications utilisent un répertoire source partagé.
Parce que Docker empêche l'ajout de fichiers à partir de dossiers situés en dehors du répertoire contextuel ( project/app1), je ne peux pas ajouter de fichiers depuis ../sharedet depuis shared(le lien symbolique à l'intérieur projects/app1).

Je cherche un moyen de tromper Docker pour le faire quand même.

Ma structure de projet simplifiée

- projects
  - app1
   - Dockerfile
   - shared (symlink ../shared)
   - otherSource
  - app2
   - Dockerfile
   - shared (symlink ../shared)
   - otherSource
  - shared
    - source

Je pourrais Dockerfilemonter d'un niveau et courir à docker buildpartir de là, mais il me faut alors deux fichiers Dockerfiles (pour app1 et app2) dans le même répertoire.

Mon idée actuelle était, si je pouvais en quelque sorte cacher le fait que projects/app1/sharedc'est un lien symbolique, ce problème serait résolu. J'ai vérifié si je pouvais partager projectsavec Samba et le remonter ailleurs et configurer Samba pour qu'il traite les liens symboliques comme des dossiers normaux, mais je n'ai pas trouvé si cela était supporté (je n'ai pas beaucoup d'expérience avec Samba et je n'ai pas encore essayé, j'ai juste cherché un peu) .

Y at-il un autre outil ou astuce qui permettrait cela?

Je préférerais ne pas changer la structure des répertoires car cela causerait d’autres problèmes et éviterait plutôt de copier des fichiers.

Zoechi
la source

Réponses:

35

Je n'ai pas beaucoup d'expérience dockeret je ne peux donc pas promettre que cela fonctionnera, mais un choix serait de monter le répertoire au lieu de s'y connecter:

$ cd projects/app1
$ mkdir shared
$ sudo mount -o bind ../shared shared/

Cela s’attachera ../sharedà ./sharedet devrait être complètement transparent pour le système. Comme expliqué dans man mount:

La reliure monte.

Depuis Linux 2.4.0, il est possible de remonter une partie de la hiérarchie des fichiers ailleurs. L'appel est:

mount --bind olddir newdir

ou en utilisant cette entrée fstab:

/olddir /newdir none bind

Après cet appel, le même contenu est accessible à deux endroits.

terdon
la source
1
@zoechi c'est parfaitement sur le sujet sur les deux sites. En règle générale, je posterais ici plus de questions techniques comme celle-ci sur U & L et davantage de questions sur l'espace utilisateur. Le choix est cependant entièrement à vous. D'un côté, il y a plus d'utilisateurs ici, donc plus de globes oculaires, de l'autre, il y a une concentration beaucoup plus élevée de personnes professionnelles * nix sur U & L. Assurez-vous simplement de ne pas poser la même question sur les deux sites. Si vous souhaitez le déplacer, supprimez-le ou signalez-le à l'attention du mod et demandez-lui de migrer.
Terdon
2
Il était impératif pour moi de redémarrer le démon docker! Sinon, le répertoire monté n'était pas visible dans le conteneur.
Dim
@dim oui! J'ai essayé de le faire fonctionner avec Capistrano et cela n'a pas fonctionné - il s'avère que j'ai monté les répertoires partagés après avoir démarré le conteneur
csch
Malheureusement, cela ne fonctionnera pas pour les utilisateurs Windows ou OS X. Le débat sur cette question a été ... animé.
Jason
le montage est-il 'dédié' au contrôle de source, par exemple github? ou devrais-je le faire à chaque fois?
Pie6k
23

Ce problème a été soulevé à plusieurs reprises dans la communauté Docker. Cela enfreint fondamentalement l'exigence d' Dockerfileêtre répétable si vous l'exécutez ou si je l'exécute. Donc, je ne m'attendrais pas à cette capacité, comme décrit dans ce ticket: La commande ADD de Dockerfile ne suit pas les liens symboliques sur l'hôte # 1676 .

Il faut donc concevoir une approche différente. Si vous regardez ce problème: AJOUTEZ pour supporter les liens symboliques dans l'argument # 6094 , un de nos amis de U & L ( @Patrick aka. Phemmer) fournit une solution de contournement intelligente.

$ tar -czh . | docker build -

Cela indique tarde déréférencer les liens symboliques du répertoire en cours, puis de les diriger vers la docker build -commande.

extrait de la page de manuel de tar
-c, --create
       create a new archive

-h, --dereference
       follow symlinks; archive and dump the files they point to

-z, --gzip, --gunzip --ungzip
slm
la source
3
C'est une excellente solution! Je comprends pourquoi Docker affirme vouloir supprimer cette fonctionnalité. Cependant, il existe une différence considérable dans le flux de travail que j'utilise lors du développement de mon projet de conteneurisation et dans la manière dont je pense qu'il sera construit pour la production. Sur ma machine locale, je veux une boucle de rétroaction très serrée. Mon application a 1 dépôt Git et l'environnement de construction des conteneurs a un 2e dépôt. Je dois être capable de faire des éditions et de construire des tests localement avant de pouvoir décider si je veux valider et pousser. Je n'aurai pas de liens symboliques ou d'instructions ADD dans mon projet final.
Bruno Bronosky
6
Les fichiers docker ne sont pas répétables. Les dockers ne peuvent pas être reproduits, car ils ont presque tous apt-get ou quelque chose d’équivalent au niveau 2 ou 3 et apt-get n’est pas reproductible. Lier la stratégie de développement de Docker à une tentative malavisée de concrétiser l'impossible véritable ne fera que selle Docker avec une série de mauvaises abstractions qui n'aident personne. nathanleclaire.com/blog/2014/09/29/…
Jason
1
Ok, donc je ne vois pas vraiment pourquoi c'est mieux qu'une cpcommande, pouvez-vous expliquer pourquoi c'est mieux? Je pense aussi que le tuyau est déroutant / trop compliqué. Pourquoi ne pas simplement mettre la commande tar au-dessus de la commande de construction. J'imagine qu'alors vous écraseriez le dir symbolique par le vrai dir.
Alexander Mills
1
@AlexanderMills - la meilleure façon de voir ce qui se passe est de l'essayer et de voir la différence. En outre, ce qui précède est la construction d'un conteneur et non d'un conteneur, il n'y a donc pas de montage. stackoverflow.com/questions/37328370/… . Je vous suggère fortement d'essayer toutes ces choses, cela aura beaucoup plus de sens.
slm
1
Je viens d'ajouter /bin/cp ../requirements.txt . && docker build ...à un Makefile pour construire Docker, c'était plus facile
user5359531