ต่อเชื่อมไดเรกทอรีโฮสต์ด้วยลิงก์สัญลักษณ์ภายในในคอนเทนเนอร์นักเทียบท่า


115

ฉันติดตั้งคอนเทนเนอร์ด้วยพารามิเตอร์นี้:

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

ภายใน / home / test ในโฮสต์จะมีลิงก์สัญลักษณ์ที่ชี้ไปที่ / mnt / โฟลเดอร์

แต่ลิงก์นั้นแม้ว่าจะสามารถมองเห็นได้ว่าชี้ไปที่ใด แต่ดูเหมือนว่าจะเสียในคอนเทนเนอร์:

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

เป็นไปได้ไหมที่จะทำในนักเทียบท่า? ฉันไม่แน่ใจว่ามีวิธีทำหรือไม่

ฉันรู้ว่าฉันสามารถกำหนดตำแหน่งที่ลิงก์สัญลักษณ์ชี้ไปได้โดยตรง แต่ฉันแค่สงสัยว่านี่เป็นไปได้หรือไม่


ฉันเคยได้ยินเกี่ยวกับปัญหาในการแมปกับ/mntปลายทางซึ่งอาจเป็นเฉพาะโฮสต์สิ่งที่ปลอดภัยที่สุดคือการหลีกเลี่ยงหากทำได้
ldg

คำตอบ:


156

Symlinks เป็นความท้าทายที่ยิ่งใหญ่ในนักเทียบท่า ในกรณีของคุณคุณสามารถเมานต์ไดเร็กทอรีทั้งสอง:

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

สำหรับลิงก์สัญลักษณ์ในการทำงานทั้งภายในและภายนอกคอนเทนเนอร์ต้องเป็นพา ธ สัมบูรณ์และใช้ชื่อเดียวกันทุกประการ

โดยทั่วไป symlink ไม่ทำงานในนักเทียบท่า ฉันพบว่านี่เป็นวิธีที่ยาก


จะทำอย่างไรถ้าฉันมีลิงก์สัญลักษณ์ใน windows เส้นทางอาจเป็น c: \ (ด้วยอักษรระบุไดรฟ์อัฒภาคและแบ็กสแลช)?
Eitan

2
@Eitan ออกจาก windows และใช้ระบบ linux / unix เมื่อคุณต้องการทำงานกับนักเทียบท่า
Nam G VU

ใช่. ฉันเชื่อมั่นว่า Windows ใช้งานได้กับ CIF และ NFS ใช้งานได้เฉพาะในเวอร์ชัน Windows Server เท่านั้น (เหตุใดพื้นฐานจึงมีเฉพาะบนเซิร์ฟเวอร์ Windows เท่านั้นเนื่องจากมีค่าใช้จ่ายและ Microsoft ต้องการให้คุณจ่าย)
Eitan

พยายามทั้งวันด้วยการพยายามทำให้ symlink ของที่เก็บข้อมูล Laravel ทำงานได้ สำหรับdocker-composeการกำหนดค่าจะเป็นเช่นนี้ volumes: [./:/var/www, ./public/storage:/var/www/public/storage]. นี่public/storageเป็น symlink ./storage/app/publicไป ขอบคุณสำหรับการแก้ปัญหา!
ม.ค. Iwanow

20

ทางออกหนึ่งคือทำให้ Docker เมานต์ไฟล์ต้นฉบับ แต่ใช้readlink -fที่พิมพ์ตำแหน่งจริงของไฟล์ ด้วยวิธีนี้คุณยังคงสามารถอ้างอิงตำแหน่ง symlink ในคำสั่งของคุณได้เช่น

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


ไม่ทำงาน - ส่งผลให้มี
symlink ที่

บน macOS: perl -MCwd -le 'print Cwd::abs_path(shift)' "$path"(จากstackoverflow.com/questions/7665/… )
akauppi

8
ฉันยังไม่ได้ทดสอบใน Docker แต่จากการเล่นกับ readlink ดูเหมือนว่าสิ่งนี้จะใช้ได้กับ / home / test / เป็น symlink แต่ไม่ใช่ if / home / test / มี symlink
Justin Donnelly
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.