Gắn thư mục máy chủ với một liên kết tượng trưng bên trong trong vùng chứa docker


104

Tôi đã gắn vùng chứa với tham số này:

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

Bên trong / home / test trong máy chủ có một liên kết tượng trưng trỏ đến thư mục / mnt /.

Nhưng liên kết đó, mặc dù có thể được nhìn thấy nơi trỏ đến, dường như bị hỏng bên trong vùng chứa:

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

Điều đó thậm chí có thể được thực hiện trong docker? Tôi không chắc liệu có cách nào để làm điều đó hay không.

Tôi biết tôi chỉ có thể gắn trực tiếp vào nơi mà liên kết tượng trưng đang trỏ đến nhưng tôi chỉ tự hỏi liệu đây có phải là khả năng không.


Tôi đã nghe nói về các vấn đề ánh xạ tới một /mntđiểm cuối, có thể dành riêng cho từng máy chủ - điều an toàn nhất là tránh nó nếu bạn có thể.
ldg

Câu trả lời:


144

Các liên kết tượng trưng là một thách thức lớn bên trong docker. Trong trường hợp của bạn, bạn có thể gắn kết cả hai thư mục:

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

Để các liên kết tượng trưng hoạt động cả bên trong và bên ngoài vùng chứa, chúng phải là đường dẫn tuyệt đối và sử dụng chính xác các tên giống nhau.

Nói chung, các liên kết tượng trưng không hoạt động bên trong docker. Tôi thấy đây là một cách khó.


Phải làm gì nếu tôi có một liên kết tượng trưng được tạo trong cửa sổ. Đường dẫn có thể là c: \ (với ký tự ổ đĩa, dấu chấm phẩy và dấu gạch chéo ngược)?
Eitan

1
@Eitan Rời khỏi cửa sổ và nắm lấy các hệ thống linux / unix khi bạn muốn làm việc với docker
Nam G VU

Đúng. Tôi đã tin rằng Windows hoạt động với CIF và NFS chỉ có trên các phiên bản Windows Server (Tại sao điều cơ bản chỉ có trên các máy chủ windows - chỉ vì nó tốn kém và Microsoft muốn bạn trả tiền).
Eitan

Đã vật lộn cả ngày với việc này để cố gắng làm cho liên kết tượng trưng lưu trữ Laravel hoạt động. Đối với docker-composecấu hình sẽ như thế này. volumes: [./:/var/www, ./public/storage:/var/www/public/storage]. Đây, public/storagelà một liên kết biểu tượng tới ./storage/app/public. Cảm ơn bạn cho giải pháp!
Jan Iwanow

19

Một giải pháp là làm cho Docker gắn tệp gốc, nhưng sử dụng readlink -fđể in vị trí thực của tệp. Bằng cách này, bạn vẫn có thể tham chiếu vị trí liên kết biểu tượng trong lệnh của mình, ví dụ:

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


Không hoạt động - kết quả này trong symlink mất tích cùng
Ami Mahloof

Trên macOS: perl -MCwd -le 'print Cwd::abs_path(shift)' "$path"(từ stackoverflow.com/questions/7665/… )
akauppi

7
Tôi chưa thử nghiệm nó trong Docker, nhưng khi thử với readlink, có vẻ như điều này sẽ hoạt động với / home / test / một liên kết tượng trưng, ​​nhưng không phải nếu / home / test / chứa một liên kết tượng trưng.
Justin Donnelly
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.