67 votes

Comment faire apparaître un dossier en lien symbolique comme un dossier normal ?

J'ai deux applications Dart que je dois dockeriser. Ces deux applications utilisent un répertoire source partagé.
Parce que Docker empêche l'ajout de fichiers provenant de dossiers situés en dehors du répertoire de contexte ( project/app1 ) Je ne peux pas ajouter de fichiers à partir de ../shared ni de shared (le lien symbolique à l'intérieur de projects/app1 ).

Je cherche un moyen d'inciter Docker à le faire de toute façon.

Ma structure de projet simplifiée

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

Je pourrais bouger Dockerfile un niveau supérieur et courir docker build à partir de là, mais j'ai alors besoin de deux Dockerfiles (pour app1 et app2) dans le même répertoire.

Mon idée était que, si je pouvais d'une manière ou d'une autre cacher le fait que projects/app1/shared est un lien symbolique, ce problème serait résolu. J'ai vérifié si je pouvais partager projects en utilisant 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 est pris en charge (je n'ai pas beaucoup d'expérience avec Samba et je ne l'ai pas encore essayé, j'ai juste fait quelques recherches).

Existe-t-il un autre outil ou une autre astuce qui permettrait de le faire ?

Je préférerais ne pas modifier la structure des répertoires, car cela entraînerait d'autres problèmes, et je préférerais également ne pas copier de fichiers.

62voto

Batur Points 11

Ce problème a été soulevé à plusieurs reprises dans la communauté Docker. En fait, il viole l'exigence selon laquelle une Dockerfile être répétable si vous l'exécutez ou si je l'exécute. Je ne m'attendrais donc pas à cette capacité, telle que décrite dans ce billet : La commande ADD de Dockerfile ne suit pas les liens symboliques sur l'hôte #1676 .

Vous devez donc concevoir une approche différente. Si vous regardez cette question : AJOUTER pour supporter les liens symboliques dans l'argument #6094 un de nos amis de U&L ( @Patrick alias phemmer) propose une solution de contournement astucieuse.

$ tar -czh . | docker build -

Cela signifie que tar pour déréférencer les liens symboliques du répertoire courant, et ensuite les envoyer à la fonction docker build - commandement.

extrait de la page de manuel tar

-c, --create
       create a new archive

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

-z, --gzip, --gunzip --ungzip

53voto

Mohsin Points 11

Je n'ai pas beaucoup d'expérience avec docker Je ne peux donc pas vous promettre que cela fonctionnera, mais une possibilité serait de monter le répertoire au lieu de créer un lien vers celui-ci :

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

Cela attachera ../shared a ./shared et devrait être complètement transparent pour le système. Comme expliqué dans man mount :

La liaison s'installe.

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

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 en deux endroits.

0voto

Venryx Points 196

J'ai été suffisamment frustré pour créer un petit utilitaire NodeJS pour m'aider dans cette tâche : synchroniseur de fichiers

Utilisation de base :

// starts live-sync of files under "common_files" to "my-app/HardLinked/common_files"
npx file-syncer --from common_files --to my-app/HardLinked

Plus d'informations sur cette réponse de Stackoverflow et le Repo Github .

SistemesEz.com

SystemesEZ est une communauté de sysadmins où vous pouvez résoudre vos problèmes et vos doutes. Vous pouvez consulter les questions des autres sysadmins, poser vos propres questions ou résoudre celles des autres.

Powered by:

X