Mounten Sie das Host-Verzeichnis mit einem symbolischen Link im Docker-Container


94

Ich habe den Container mit diesem Parameter gemountet:

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

In / home / test auf dem Host befindet sich ein symbolischer Link, der auf einen Ordner / mnt / verweist.

Aber dieser Link scheint im Container unterbrochen zu sein, obwohl er zu sehen ist, wohin er zeigt:

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

Ist das überhaupt im Docker möglich? Ich bin mir nicht sicher, ob es einen Weg gibt, dies zu tun.

Ich weiß, dass ich direkt an der Stelle montieren kann, auf die der symbolische Link zeigt, aber ich habe mich nur gefragt, ob dies möglich ist.


Ich habe von Problemen gehört, die einem /mntEndpunkt zugeordnet sind, der möglicherweise hostspezifisch ist. Am sichersten ist es, dies zu vermeiden, wenn Sie können.
ldg

Antworten:


133

Symlinks sind eine große Herausforderung innerhalb von Docker. In Ihrem Fall können Sie beide Verzeichnisse bereitstellen:

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

Damit symbolische Links sowohl innerhalb als auch außerhalb des Containers funktionieren, müssen sie absolute Pfade sein und genau dieselben Namen verwenden.

Im Allgemeinen funktionieren Symlinks im Docker nicht. Ich fand das auf die harte Tour.


Was tun, wenn in Windows ein symbolischer Link erstellt wurde? Der Pfad kann c: \ sein (mit einem Laufwerksbuchstaben, einem Semikolon und einem Backslash)?
Eitan

@Eitan Verlassen Sie Windows und nutzen Sie Linux / Unix-Systeme, wenn Sie mit Docker arbeiten möchten
Nam G VU

Ja. Ich habe festgestellt, dass Windows mit CIF funktioniert und NFS nur für Windows Server-Versionen verfügbar ist (Warum dies nur für Windows Server gilt - nur, weil es kostet und Microsoft möchte, dass Sie bezahlen).
Eitan

Ich hatte einen ganzen Tag damit zu kämpfen, den Laravel-Speichersymlink zum Laufen zu bringen. Für die docker-composeKonfiguration wäre das so. volumes: [./:/var/www, ./public/storage:/var/www/public/storage]. Hier public/storageist ein Symlink zu ./storage/app/public. Danke für die Lösung!
Jan Iwanow

18

Eine Lösung besteht darin, Docker dazu zu bringen, die Originaldatei bereitzustellen, aber readlink -fden tatsächlichen Speicherort der Datei zu verwenden. Auf diese Weise können Sie weiterhin auf die Symlink-Position in Ihrem Befehl verweisen, z

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


Funktioniert nicht - dies führt zu den gleichen fehlenden Symlinks
Ami Mahloof

Unter macOS: perl -MCwd -le 'print Cwd::abs_path(shift)' "$path"(von stackoverflow.com/questions/7665/… )
akauppi

6
Ich habe getestet es nicht in Docker, aber mit Readlink vom Spielen um, scheint es , dass dies funktionieren wird von / home / test / ist ein symbolischer Link, aber nicht , wenn / home / test / enthält einen symbolischen Link.
Justin Donnelly
Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.