Cách tạo thư mục symlinked xuất hiện như một thư mục bình thường


38

Tôi có hai ứng dụng phi tiêu tôi cần để cập bến. Hai ứng dụng này sử dụng một thư mục nguồn chia sẻ.
Vì Docker ngăn không cho thêm tệp từ các thư mục bên ngoài thư mục ngữ cảnh ( project/app1) nên tôi không thể thêm tệp từ ../sharedhoặc từ shared(liên kết tượng trưng bên trong projects/app1).

Tôi đang tìm cách lừa Docker để làm điều đó.

Cấu trúc dự án đơn giản hóa của tôi

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

Tôi có thể di chuyển Dockerfilemột cấp lên và chạy docker buildtừ đó nhưng sau đó tôi cần hai Dockerfiles (cho app1 và app2) trong cùng một thư mục.

Ý tưởng hiện tại của tôi là, nếu tôi có thể bằng cách nào đó che giấu sự thật rằng đó projects/app1/sharedlà một liên kết tượng trưng thì vấn đề này sẽ được giải quyết. Tôi đã kiểm tra xem tôi có thể chia sẻ projectsbằng Samba và kết nối nó ở một nơi khác không và định cấu hình Samba để xử lý các liên kết tượng trưng như các thư mục bình thường nhưng không tìm thấy liệu điều này có được hỗ trợ hay không (tôi chưa có nhiều kinh nghiệm với Samba và chưa thử nó, chỉ tìm kiếm một chút) .

Có công cụ hay thủ thuật nào khác cho phép điều đó không?

Tôi thà không thay đổi cấu trúc thư mục bởi vì điều này sẽ gây ra những rắc rối khác và cũng không sao chép các tập tin xung quanh.

Câu trả lời:


35

Tôi không có nhiều kinh nghiệm dockervì vậy tôi không thể hứa điều này sẽ hoạt động nhưng một lựa chọn sẽ là gắn kết thư mục thay vì liên kết với nó:

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

Điều đó sẽ gắn ../sharedvào ./sharedvà nên hoàn toàn minh bạch cho hệ thống. Như đã giải thích trong man mount:

Các liên kết gắn kết.

Kể từ Linux 2.4.0, có thể kết nối lại một phần của hệ thống phân cấp tệp ở một nơi khác. Cuộc gọi là:

mount --bind olddir newdir

hoặc bằng cách sử dụng mục nhập fstab này:

/olddir /newdir none bind

Sau cuộc gọi này, nội dung tương tự có thể truy cập ở hai nơi.


1
@zoechi điều này là hoàn hảo về chủ đề trên cả hai trang web. Theo nguyên tắc chung, tôi sẽ đăng nhiều câu hỏi kỹ thuật như thế này trên U & L và nhiều câu hỏi về không gian người dùng hơn ở đây. Sự lựa chọn là hoàn toàn tùy thuộc vào bạn mặc dù. Một mặt, có nhiều người dùng ở đây hơn nên nhiều nhãn cầu hơn, mặt khác, có sự tập trung cao hơn của những người * nix chuyên nghiệp trên U & L. Chỉ cần đảm bảo rằng bạn không đăng cùng một câu hỏi trên cả hai trang web. Nếu bạn muốn di chuyển nó, hãy xóa cái này hoặc gắn cờ để chú ý mod và yêu cầu họ di chuyển.
terdon

2
Nó là bắt buộc đối với tôi để khởi động lại docker daemon! Khác các dir được gắn kết không thể nhìn thấy trong container.
mờ

@dim vâng! Tôi đã cố gắng để nó hoạt động với Capistrano và nó không hoạt động - hóa ra tôi đã gắn các thư mục được chia sẻ sau khi tôi khởi động container
csch

Thật không may, điều này sẽ không hoạt động cho người dùng Windows hoặc OS X. Cuộc tranh luận về vấn đề này đã ... sống động.
Jason

đang gắn 'cam kết' với kiểm soát nguồn, ví dụ như github? hoặc tôi sẽ phải làm điều đó mỗi lần?
pie6k

23

Vấn đề này đã xuất hiện nhiều lần trong cộng đồng Docker. Về cơ bản, nó vi phạm yêu cầu có Dockerfilethể lặp lại nếu bạn chạy nó hoặc tôi chạy nó. Vì vậy, tôi không mong đợi khả năng này, như được mô tả trong vé này: Lệnh Dockerfile ADD không tuân theo các liên kết tượng trưng trên máy chủ # 1676 .

Vì vậy, bạn phải quan niệm một cách tiếp cận khác. Nếu bạn xem xét vấn đề này: THÊM để hỗ trợ các liên kết tượng trưng trong đối số # 6094 , một người bạn của chúng tôi từ U & L ( @Patrick aka. Phemmer) cung cấp một cách giải quyết thông minh.

$ tar -czh . | docker build -

Điều này cho biết tarđể hủy bỏ các liên kết tượng trưng từ thư mục hiện tại, và sau đó chuyển tất cả chúng vào docker build -lệnh.

đoạn trích từ trang tar man
-c, --create
       create a new archive

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

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

3
Đây là một giải pháp TUYỆT VỜI! Tôi hiểu tại sao Docker tuyên bố họ muốn bỏ qua tính năng này. Tuy nhiên, có một sự khác biệt đáng kể trong quy trình công việc tôi sử dụng trong khi phát triển dự án container hóa của mình và cách tôi mong đợi nó sẽ được xây dựng để sản xuất. Trên máy cục bộ của tôi, tôi muốn một vòng phản hồi siêu chặt chẽ. Ứng dụng của tôi có 1 git repo và môi trường xây dựng cho các container có repo thứ 2. Tôi cần có khả năng chỉnh sửa và xây dựng các bài kiểm tra cục bộ trước khi tôi có thể quyết định xem tôi có muốn cam kết và thúc đẩy hay không. Tôi sẽ không có symlink hoặc ADD hướng dẫn trong dự án cuối cùng của mình.
Bruno Bronosky

6
Dockerfiles không thể lặp lại. Dockerfiles không thể được lặp lại, vì hầu hết chúng đều có apt-get hoặc thứ gì đó tương đương ở lớp thứ 2 hoặc thứ 3 và apt-get không thể lặp lại. Đưa chiến lược phát triển Docker vào một nỗ lực sai lầm để biến điều không thể thành sự thật sẽ chỉ làm yên Docker với một loạt các khái niệm trừu tượng không giúp được ai. nathanleclaire.com/blog/2014/09/29/ Mạnh
Jason

1
Ok, vì vậy tôi không thực sự thấy lý do tại sao điều này tốt hơn một cplệnh, bạn có thể giải thích tại sao nó tốt hơn không? Tôi cũng nghĩ rằng đường ống là khó hiểu / quá phức tạp. Tại sao không đặt lệnh tar phía trên lệnh build. Tôi đoán bởi vì sau đó bạn sẽ ghi đè lên thư mục được liên kết với thư mục thực.
Alexander Mills

1
@AlexanderMills - Cách tốt nhất để xem điều gì xảy ra là thử nó và xem sự khác biệt. Ngoài ra, bên trên là một tòa nhà của một container không chạy, vì vậy không có lắp đặt. stackoverflow.com/questions/37328370/ Mạnh . Tôi thực sự khuyên bạn nên thử tất cả những điều này, nó sẽ có ý nghĩa hơn nhiều.
slm

1
Tôi vừa thêm vào /bin/cp ../requirements.txt . && docker build ...Makefile để xây dựng Docker, mọi thứ dễ dàng hơn
user5359531
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.