Chắc chắn đó là một mối quan tâm. Dockerfiles thường được kiểm tra trong kho và chia sẻ với người khác. Một cách khác là cung cấp bất kỳ thông tin đăng nhập (tên người dùng, mật khẩu, mã thông báo, bất cứ điều gì nhạy cảm) dưới dạng các biến môi trường khi chạy . Điều này có thể thông qua -e
đối số (đối với các vars riêng lẻ trên CLI) hoặc --env-file
đối số (đối với nhiều biến trong một tệp) tới docker run
. Đọc này để sử dụng môi trường với docker-compose.
Sử dụng --env-file
chắc chắn là một lựa chọn an toàn hơn vì điều này bảo vệ chống lại các bí mật hiển thị trong ps
hoặc trong nhật ký nếu một người sử dụng set -x
.
Tuy nhiên, env vars cũng không đặc biệt an toàn. Chúng được hiển thị thông qua docker inspect
và do đó chúng có sẵn cho bất kỳ người dùng nào có thể chạy docker
các lệnh. (Tất nhiên, bất kỳ người dùng nào có quyền truy cập docker
vào máy chủ cũng có quyền root .)
Mẫu ưa thích của tôi là sử dụng tập lệnh bao bọc như là ENTRYPOINT
hoặc CMD
. Kịch bản trình bao bọc trước tiên có thể nhập các bí mật từ một vị trí bên ngoài vào vùng chứa trong thời gian chạy, sau đó thực thi ứng dụng, cung cấp các bí mật. Các cơ chế chính xác của điều này thay đổi dựa trên môi trường thời gian chạy của bạn. Trong AWS, bạn có thể sử dụng kết hợp các vai trò IAM, Dịch vụ quản lý khóa và S3 để lưu trữ các bí mật được mã hóa trong nhóm S3. Một cái gì đó như HashiCorp Vault hoặc uy tín là một lựa chọn khác.
AFAIK không có mẫu tối ưu để sử dụng dữ liệu nhạy cảm như là một phần của quá trình xây dựng. Trong thực tế, tôi có một câu hỏi SO về chủ đề này. Bạn có thể sử dụng docker-squash để loại bỏ các lớp khỏi hình ảnh. Nhưng không có chức năng riêng trong Docker cho mục đích này.
Bạn có thể thấy các bình luận shykes về cấu hình trong các thùng chứa hữu ích.