Docker suivre le lien symbolique en dehors du contexte

88

Encore une autre question de lien symbolique Docker. J'ai un tas de fichiers que je souhaite copier dans toutes mes versions de Docker. Ma structure dir est:

parent_dir
    - common_files
        - file.txt
    - dir1
        - Dockerfile  
        - symlink -> ../common_files

Dans l'exemple ci-dessus, je veux que file.txt soit copié lorsque je crée un docker dans dir1. Mais je ne veux pas conserver plusieurs copies de file.txt. Selon ce lien, à partir de la version 0.10 de docker, la construction de docker doit

Suivez les liens symboliques à l'intérieur de la racine du conteneur pour les instructions de construction ADD.

Mais je n'obtiens aucun fichier ou répertoire de ce type lorsque je construis avec l'une de ces lignes dans mon Dockerfile:

ADD symlink /path/dirname ou ADD symlink/file.txt /path/file.txt

L'option de montage ne le résoudra PAS pour moi (multiplateforme ...). J'ai essayé tar -czh . | docker build -tsans succès.

Existe-t-il un moyen de faire en sorte que Docker suive le lien symbolique et copie le common_files / file.txt dans le conteneur construit?

Ravi
la source

Réponses:

68

Cela n'est pas possible et ne sera pas mis en œuvre. Veuillez consulter la discussion sur le numéro 1676 de github :

Nous ne permettons pas cela parce que ce n'est pas reproductible. Un lien symbolique sur votre machine n'est pas le même que celui de ma machine et le même Dockerfile produirait deux résultats différents. Avoir également des liens symboliques vers / etc / paasswd poserait des problèmes car cela lierait les fichiers hôtes et non vos fichiers locaux.

0x7d7b
la source
Merci. Oui, j'ai remarqué ce lien avant mais je pensais que c'était pour une version beaucoup plus ancienne de docker (0.6.1). Le journal des modifications de 0.10 mentionne que c'est possible github.com/docker/docker/blob/master
Ravi
De plus, si "parent_dir" est extrait dans n'importe quel ordinateur et si le lien symbolique a un chemin relatif vers "common_files", il sera répétable.
Ravi
2
Votre devis Follow symlinks inside container's root for ADD build instructions.signifie qu'à l' intérieur du conteneur, les liens symboliques sont suivis. Pas dans le répertoire de contexte de construction. Dans ADD file.txt /dir/file.txtle répertoire dirpourrait être un lien symbolique. Les arguments que j'ai cités dans ma réponse sont toujours valides et les liens symboliques ne sont toujours pas suivis dans la dernière version. Vous pouvez rencontrer des problèmes (concernant la répétabilité) lorsque vous stockez des liens symboliques dans des systèmes de contrôle de révision comme git . Veuillez donc vous référer à cette question .
0x7d7b
1
Je vois votre point concernant les liens symboliques dans git. Mais les liens symboliques ne doivent pas nécessairement entrer dans git. Un simple script de configuration peut préparer l'environnement local en créant des liens symboliques. Pour moi, le coût de conservation de «n» copies d'un fichier partagé semble trop élevé du point de vue de la maintenance. Peut-être que je devrai le servir d'Apache. Merci.
Ravi
18
quel dommage, alors que je vois le point je ne suis pas la logique et ça me mord. Git gère parfaitement les liens symboliques et je m'attends également à ce que les builds fonctionnent sur toutes les machines et tous les environnements où le dépôt source est extrait ..?!
Gregor
9

Une possibilité est d'exécuter la construction dans le répertoire parent, avec:

$ docker build [tags...] -f dir1/Dockerfile .

(Ou de manière équivalente, dans le répertoire enfant,)

$ docker build  [tags...] -f Dockerfile ..

Le Dockerfile devra être configuré pour faire des copies / ajouts avec les chemins appropriés. Selon votre configuration, vous voudrez peut-être qu'un .dockerignoreparent laisse de côté les choses que vous ne voulez pas mettre dans le contexte.

shaunc
la source
4

Si quelqu'un a toujours ce problème, j'ai trouvé une très bonne solution sur superuser.com:

/superuser/842642/how-to-make-a-symlinked-folder-appear-as-a-normal-folder

Il suggère essentiellement d'utiliser tar pour déréférencer les liens symboliques et introduire le résultat dans la construction du docker:

$ tar -czh . | docker build -
jdabrowski
la source
Comment le faire fonctionner avec docker-compose?
vitalets
2

au lieu d'utiliser simlinks, il est possible de résoudre le problème administrativement en déplaçant simplement les fichiers de sites_available vers sites_enabled au lieu de copier ou de créer des simlinks

donc la configuration de votre site sera en une seule copie dans le dossier site_available s'il s'est arrêté ou quelque chose ou dans sites_enabled s'il doit être utilisé

Ilya Kolesnikov
la source
1

Je sais que cela rompt la portabilité de la construction de docker, mais vous pouvez utiliser des liens durs au lieu de symboliques:

ln /some/file ./hardlink
Eugène
la source
3
Pour être clair, cela fonctionne pour les fichiers, pas pour les répertoires.
GDorn