Mối quan tâm tích hợp liên tục
Nói tóm lại: Docker trong Docker (dind) không xử lý đồng thời tốt.
Lý do tại sao bạn không nên sử dụng dind cho CI là vì Docker được thiết kế để có quyền truy cập độc quyền vào thư mục mà nó sử dụng để lưu trữ (thông thường /var/lib/docker
). Dind không tôn trọng điều này vì tất cả các tiến trình con sử dụng đồng thời thư mục này. Mỗi khi bạn xây dựng lại (từ CI chẳng hạn), mọi thứ liên quan đến ứng dụng của bạn trong thư mục này có thể bị xóa sổ và buộc phải bắt đầu từ con số không. Người dùng của bạn sẽ thích nó như thế nào nếu họ nhập chi tiết thanh toán, nhấp vào "Mua hàng" và đột nhiên thấy họ quay lại màn hình đăng nhập như thể họ chưa bao giờ làm gì? Đó chỉ là UX không tốt. Hai lần xây dựng lại xảy ra cùng một lúc? Điều đó thực sự sẽ kết thúc tồi tệ cho mọi người liên quan (bao gồm cả tính toàn vẹn dữ liệu của bạn).
Mối quan tâm khác
Từ liên kết mà OP đăng tải, các mối lo ngại về bảo mật xuất hiện khi hệ thống sẽ cố gắng áp dụng các chính sách bảo mật theo kiểu rất "giống CSS", nơi một container thấp hơn có thể có quyền truy cập vào tài nguyên của bên ngoài trừ khi bị cấm rõ ràng. Hãy nhớ khi nào bạn có thể truy cập tài nguyên máy chủ web bằng cách thực hiện một cái gì đó như "mywebsite.com/../another_folder/private_resource.txt"? Ngoài ra, đôi khi các hệ thống tệp chỉ không chơi tốt với nhau khi chúng được lồng theo cách này.
Sửa chữa
Rất may, bài đăng blog trong OP có một giải pháp tốt cho vấn đề này. Trừ khi nhu cầu của bạn không được đáp ứng bởi "xây dựng / chạy / đẩy các thùng chứa Docker từ chính hệ thống CI của bạn đang chạy trên Docker", bạn có thể sử dụng -v
chế độ (thêm một khối lượng dữ liệu vào thùng chứa của bạn) trên ổ cắm Docker (thường /var/run/docker.sock:/var/run/docker.sock
) để cho phép loại truy cập bạn cần vào khối lượng dữ liệu "chia sẻ". Các thùng chứa này sẽ được bắt đầu cùng với cha mẹ, thay vì bên dưới, buộc IO đồng bộ. Bây giờ bạn có điều tương tự (gần như) như dind nhưng không có nhược điểm đi kèm với Docker không được xây dựng để tương tranh.
Tham khảo (từ OP): Sử dụng Docker-in-Docker cho CI hoặc môi trường thử nghiệm của bạn? Nghĩ cho kỹ.