Docker theo sau liên kết tượng trưng bên ngoài ngữ cảnh


90

Tuy nhiên, một câu hỏi liên kết tượng trưng Docker khác. Tôi có một loạt các tệp mà tôi muốn sao chép sang tất cả các bản dựng Docker của mình. Cấu trúc dir của tôi là:

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

Trong ví dụ trên, tôi muốn file.txt được sao chép khi tôi xây dựng docker bên trong dir1. Nhưng tôi không muốn duy trì nhiều bản sao của file.txt. Mỗi liên kết này, như các phiên bản Docker 0.10 , Docker xây dựng phải

Thực hiện theo các liên kết tượng trưng bên trong thư mục gốc của vùng chứa để biết THÊM hướng dẫn xây dựng.

Nhưng tôi không nhận được tệp hoặc thư mục nào như vậy khi tôi tạo bằng một trong hai dòng này trong Dockerfile của mình:

ADD symlink /path/dirname hoặc là ADD symlink/file.txt /path/file.txt

tùy chọn gắn kết sẽ KHÔNG giải quyết nó cho tôi (nền tảng chéo ...). Tôi đã cố gắng tar -czh . | docker build -tmà không thành công.

Có cách nào để làm cho Docker đi theo liên kết biểu tượng và sao chép common_files / file.txt vào vùng chứa được xây dựng không?

Câu trả lời:


68

Điều đó là không thể và sẽ không được thực hiện. Mời các bạn xem cuộc thảo luận về vấn đề github # 1676 :

Chúng tôi không cho phép điều này vì nó không thể lặp lại. Một liên kết tượng trưng trên máy của bạn không giống với máy của tôi và cùng một Dockerfile sẽ tạo ra hai kết quả khác nhau. Cũng có các liên kết tượng trưng đến / etc / paasswd sẽ gây ra sự cố vì nó sẽ liên kết các tệp máy chủ lưu trữ chứ không phải các tệp cục bộ của bạn.


Cảm ơn bạn. Có, tôi đã nhận thấy liên kết đó trước đây nhưng tôi nghĩ rằng đó là dành cho phiên bản docker cũ hơn nhiều (0.6.1). 0.10 của sự thay đổi log loại đề cập đến điều này có thể github.com/docker/docker/blob/master/...
Ravi

Ngoài ra, nếu "parent_dir" được đăng xuất trong bất kỳ máy tính nào và nếu liên kết biểu tượng có đường dẫn tương đối đến "common_files", nó sẽ có thể lặp lại.
Ravi

2
Trích dẫn của bạn Follow symlinks inside container's root for ADD build instructions.có nghĩa là bên trong các liên kết biểu tượng chứa được theo sau. Không có trong thư mục ngữ cảnh xây dựng. Trong ADD file.txt /dir/file.txtthư mục dircó thể là một liên kết tượng trưng. Các đối số mà tôi đã trích dẫn trong câu trả lời của mình vẫn hợp lệ và các liên kết tượng trưng vẫn không được tuân theo trong phiên bản mới nhất. Bạn có thể gặp sự cố (liên quan đến khả năng lặp lại) khi lưu trữ các liên kết tượng trưng trong các hệ thống kiểm soát sửa đổi như git . Do đó hãy tham khảo câu hỏi này .
0x7d7b

1
Tôi thấy quan điểm của bạn về liên kết tượng trưng trong git. Tuy nhiên, các liên kết tượng trưng không cần phải chuyển sang git. Một kịch bản thiết lập đơn giản có thể chuẩn bị cho env cục bộ tạo liên kết tượng trưng. Đối với tôi, chi phí lưu giữ 'n' bản sao của một tệp được chia sẻ dường như quá cao từ quan điểm bảo trì. Có lẽ tôi sẽ phải phục vụ nó trong apache. Cảm ơn bạn.
Ravi

19
Thật là xấu hổ, trong khi tôi thấy điểm tôi không tuân theo logic và nó cắn tôi. Git xử lý các liên kết biểu tượng một cách hoàn hảo và tôi cũng hy vọng các bản dựng sẽ hoạt động trên tất cả các máy và môi trường nơi repo nguồn được kiểm tra ..?!
Gregor

9

Một khả năng là chạy bản dựng trong thư mục mẹ, với:

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

(Hoặc tương đương, trong thư mục con,)

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

Dockerfile sẽ phải được cấu hình để thực hiện sao chép / thêm bằng các đường dẫn thích hợp. Tùy thuộc vào thiết lập của bạn, bạn có thể muốn một .dockerignorephụ huynh loại bỏ những thứ bạn không muốn đưa vào ngữ cảnh.



2

thay vì sử dụng các liên kết mô phỏng, có thể giải quyết vấn đề về mặt quản trị bằng cách chỉ di chuyển các tệp từ các trang_tính_có_có đến các trang_trình_tạo thay vì sao chép hoặc tạo các liên kết mô phỏng

vì vậy cấu hình trang web của bạn sẽ chỉ nằm trong một bản sao trong thư mục site_available nếu nó bị dừng hoặc thứ gì đó hoặc trong trang web_enabled nếu nó nên được sử dụng


1

Tôi biết rằng nó phá vỡ tính di động của bản dựng docker, nhưng bạn có thể sử dụng các liên kết cứng thay vì biểu tượng:

ln /some/file ./hardlink

4
Để rõ ràng, điều này hoạt động cho các tệp, không phải thư mục.
GDorn
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.