CẬP NHẬT 2016/03/02 : Tính đến Docker 1.9.0, Docker đã đặt tên khối lượng mà thay thế các thùng chứa dữ liệu chỉ . Câu trả lời dưới đây, cũng như bài đăng trên blog được liên kết của tôi, vẫn có giá trị theo cách nghĩ về dữ liệu bên trong docker nhưng xem xét sử dụng các khối lượng được đặt tên để thực hiện mô hình được mô tả bên dưới thay vì các thùng chứa dữ liệu.
Tôi tin rằng cách thức kinh điển để giải quyết điều này là bằng cách sử dụng các thùng chứa chỉ có dữ liệu . Với phương pháp này, tất cả quyền truy cập vào dữ liệu âm lượng đều thông qua các thùng chứa sử dụng -volumes-from
bộ chứa dữ liệu, vì vậy uid / gid của máy chủ không thành vấn đề.
Ví dụ: một trường hợp sử dụng được đưa ra trong tài liệu đang sao lưu một khối lượng dữ liệu. Để làm điều này, một container khác được sử dụng để thực hiện sao lưu thông qua tar
và nó cũng sử dụng -volumes-from
để gắn kết âm lượng. Vì vậy, tôi nghĩ điểm mấu chốt của Grok là: thay vì suy nghĩ về cách truy cập dữ liệu trên máy chủ với quyền thích hợp, hãy nghĩ về cách làm bất cứ điều gì bạn cần - sao lưu, duyệt, v.v. - thông qua một container khác . Bản thân các container cần sử dụng uid / gids nhất quán, nhưng chúng không cần ánh xạ tới bất cứ thứ gì trên máy chủ, do đó vẫn có thể di động.
Điều này cũng tương đối mới đối với tôi nhưng nếu bạn có một trường hợp sử dụng cụ thể, hãy bình luận và tôi sẽ cố gắng mở rộng câu trả lời.
CẬP NHẬT : Đối với trường hợp sử dụng đã cho trong các nhận xét, bạn có thể có một hình ảnh some/graphite
để chạy than chì và một hình ảnh some/graphitedata
làm nơi chứa dữ liệu. Vì vậy, bỏ qua các cổng và như vậy, Dockerfile
hình ảnh some/graphitedata
là một cái gì đó như:
FROM debian:jessie
# add our user and group first to make sure their IDs get assigned consistently, regardless of other deps added later
RUN groupadd -r graphite \
&& useradd -r -g graphite graphite
RUN mkdir -p /data/graphite \
&& chown -R graphite:graphite /data/graphite
VOLUME /data/graphite
USER graphite
CMD ["echo", "Data container for graphite"]
Xây dựng và tạo bộ chứa dữ liệu:
docker build -t some/graphitedata Dockerfile
docker run --name graphitedata some/graphitedata
Các some/graphite
Dockerfile cũng sẽ nhận được cùng một uid / gids, do đó nó có thể trông như thế này:
FROM debian:jessie
# add our user and group first to make sure their IDs get assigned consistently, regardless of other deps added later
RUN groupadd -r graphite \
&& useradd -r -g graphite graphite
# ... graphite installation ...
VOLUME /data/graphite
USER graphite
CMD ["/bin/graphite"]
Và nó sẽ được chạy như sau:
docker run --volumes-from=graphitedata some/graphite
Ok, bây giờ cung cấp cho chúng tôi thùng chứa than chì của chúng tôi và thùng chứa chỉ có dữ liệu được liên kết với người dùng / nhóm chính xác (lưu ý rằng bạn cũng có thể sử dụng lại bộ some/graphite
chứa cho bộ chứa dữ liệu, ghi đè lên mục nhập / cmd khi chạy nó, nhưng có chúng như hình ảnh riêng biệt IMO rõ ràng hơn).
Bây giờ, giả sử bạn muốn chỉnh sửa một cái gì đó trong thư mục dữ liệu. Vì vậy, thay vì liên kết việc gắn âm lượng vào máy chủ và chỉnh sửa nó ở đó, hãy tạo một thùng chứa mới để thực hiện công việc đó. Hãy gọi nó some/graphitetools
. Cho phép cũng tạo người dùng / nhóm thích hợp, giống như some/graphite
hình ảnh.
FROM debian:jessie
# add our user and group first to make sure their IDs get assigned consistently, regardless of other deps added later
RUN groupadd -r graphite \
&& useradd -r -g graphite graphite
VOLUME /data/graphite
USER graphite
CMD ["/bin/bash"]
Bạn có thể tạo DRY này bằng cách kế thừa từ some/graphite
hoặc some/graphitedata
trong Dockerfile hoặc thay vì tạo một hình ảnh mới, chỉ cần sử dụng lại một trong những hình ảnh hiện có (ghi đè điểm nhập / cmd nếu cần).
Bây giờ, bạn chỉ cần chạy:
docker run -ti --rm --volumes-from=graphitedata some/graphitetools
và sau đó vi /data/graphite/whatever.txt
. Điều này hoạt động hoàn hảo bởi vì tất cả các container có cùng một người sử dụng than chì với uid / gid phù hợp.
Vì bạn không bao giờ gắn kết /data/graphite
từ máy chủ lưu trữ, bạn không quan tâm làm thế nào máy chủ uid / gid ánh xạ tới uid / gid được xác định bên trong graphite
và graphitetools
các thùng chứa. Những container này hiện có thể được triển khai cho bất kỳ máy chủ nào và chúng sẽ tiếp tục hoạt động hoàn hảo.
Điều thú vị về điều này là graphitetools
có thể có tất cả các loại tiện ích và tập lệnh hữu ích, giờ đây bạn cũng có thể triển khai theo cách di động.
CẬP NHẬT 2 : Sau khi viết câu trả lời này, tôi quyết định viết một bài đăng blog đầy đủ hơn về phương pháp này. Tôi hy vọng nó sẽ giúp.
CẬP NHẬT 3 : Tôi đã sửa câu trả lời này và thêm chi tiết cụ thể. Trước đây nó chứa một số giả định không chính xác về quyền sở hữu và perm - quyền sở hữu thường được chỉ định tại thời điểm tạo khối lượng tức là trong bộ chứa dữ liệu, vì đó là khi khối lượng được tạo. Xem blog này . Mặc dù vậy, đây không phải là một yêu cầu - bạn chỉ có thể sử dụng bộ chứa dữ liệu làm "tham chiếu / xử lý" và đặt quyền sở hữu / perms trong một bộ chứa khác thông qua chown trong một điểm nhập, kết thúc bằng gosu để chạy lệnh là người dùng chính xác. Nếu bất cứ ai quan tâm đến phương pháp này, xin vui lòng bình luận và tôi có thể cung cấp các liên kết đến một mẫu bằng cách sử dụng phương pháp này.