Jelas itu adalah masalah. Dockerfiles biasanya masuk ke repositori dan dibagikan dengan orang lain. Alternatifnya adalah memberikan kredensial (nama pengguna, kata sandi, token, apa pun yang sensitif) sebagai variabel lingkungan saat runtime . Ini dimungkinkan melalui -e
argumen (untuk masing-masing vars pada CLI) atau --env-file
argumen (untuk beberapa variabel dalam file) ke docker run
. Baca ini untuk menggunakan lingkungan dengan komposisi buruh pelabuhan.
Menggunakan --env-file
jelas merupakan pilihan yang lebih aman karena ini melindungi terhadap rahasia yang muncul di ps
atau dalam log jika digunakan set -x
.
Namun, env vars juga tidak terlalu aman. Mereka terlihat melalui docker inspect
, dan karenanya mereka tersedia untuk setiap pengguna yang dapat menjalankan docker
perintah. (Tentu saja, setiap pengguna yang memiliki akses ke docker
host juga memiliki root .)
Pola pilihan saya adalah menggunakan skrip pembungkus sebagai ENTRYPOINT
atau CMD
. Skrip pembungkus dapat pertama-tama mengimpor rahasia dari lokasi luar ke dalam wadah pada saat run time, kemudian menjalankan aplikasi, memberikan rahasia. Mekanik yang tepat untuk ini berbeda-beda berdasarkan lingkungan waktu kerja Anda. Di AWS, Anda dapat menggunakan kombinasi peran IAM, Layanan Manajemen Kunci , dan S3 untuk menyimpan rahasia terenkripsi dalam keranjang S3. Sesuatu seperti HashiCorp Vault atau credstash adalah pilihan lain.
AFAIK tidak ada pola optimal untuk menggunakan data sensitif sebagai bagian dari proses pembangunan. Bahkan, saya punya pertanyaan SO tentang topik ini. Anda dapat menggunakan docker-squash untuk menghapus lapisan dari suatu gambar. Tetapi tidak ada fungsi asli di Docker untuk tujuan ini.
Anda mungkin menemukan komentar shykes tentang konfigurasi dalam wadah berguna.