Program sering mengontrol operasi melalui konfigurasi yang dibundel dengan perangkat lunak, dan variabel lingkungan memungkinkan pengguna untuk mengaturnya saat runtime. Namun, menjalankan proses di wadah Docker memperumit banyak hal, jadi bagaimana Anda meneruskan variabel lingkungan ke wadah?
Untuk Apa Variabel Lingkungan Digunakan?
Variabel lingkungan memungkinkan Anda untuk memisahkan konfigurasi dari aplikasi yang dapat dieksekusi. Misalnya, Anda tidak ingin menyimpan sandi basis data produksi di basis kode—jika Anda melakukannya, sandi akan terlihat dari Git, dan siapa pun yang memiliki akses ke kode Anda dapat menghapus basis data Anda.
Sebagai gantinya, Anda menyetelnya dengan variabel lingkungan, yang menyimpan pasangan nilai kunci sederhana, dan memungkinkan Anda mengakses nilai di aplikasi apa pun yang berjalan dalam sesi shell yang sama (tidak dapat diakses secara global). Ini juga memiliki keuntungan karena dapat dengan mudah menentukan konfigurasi yang berbeda untuk lingkungan yang berbeda. Misalnya, memiliki kunci terpisah untuk database pengembangan dan produksi, atau menggunakan titik akhir API yang berbeda.
Menyetel variabel ini untuk container Docker dapat dilakukan dengan tiga cara utama—dengan argumen CLI, .env
file konfigurasi, atau melalui docker-compose
.
Dengan Argumen Baris Perintah
Perintah yang digunakan untuk meluncurkan kontainer Docker, docker run
, menerima variabel ENV sebagai argumen. Cukup jalankan dengan -e
flag, singkatan dari --env
, dan berikan pasangan kunci=nilai:
sudo docker run -e POSTGRES_USER='postgres' -e POSTGRES_PASSWORD='password' ...
Dan, jika Anda sudah memiliki variabel lingkungan yang disetel di lingkungan yang menjalankan perintah itu, Anda bisa meneruskannya langsung dengan nama:
// set variable POSTGRES_PASSWORD='password' // use it later docker run -e POSTGRES_PASSWORD -e POSTGRES_USER ...
Keamanan Tambahan Dengan File .env
Melewati variabel dengan argumen CLI berfungsi dengan baik, tetapi memiliki kelemahan—variabel tersebut terlihat dari host. Mereka masuk ke riwayat perintah, dan terlihat di daftar proses untuk proses yang diluncurkan.
Linux memiliki cara bawaan untuk mengelola izin untuk ini—akses file. Menyimpan variabel dalam .env
file memungkinkan Anda untuk mengontrol akses ke file itu dengan izin file (chmod
, chown
).
Buat .env
file dengan variabel dalam format berikut, masing-masing pada baris baru:
POSTGRES_PASSWORD='password' POSTGRES_USER='postgres' APPLICATION_URL='example.com'
Kemudian, berikan ke docker run
dengan --env-file
bendera:
docker run --env-file ./envfile ...
Dengan Docker-Compose
Tentu saja, banyak orang tidak meluncurkan kontainer Docker secara langsung dengan docker run
, dan sebagai gantinya memilih untuk menggunakan docker-compose
file untuk menangani konfigurasi beberapa wadah yang semuanya mewakili satu aplikasi.
Untuk meneruskan variabel lingkungan ke wadah yang diluncurkan dengan cara ini, Anda harus mengonfigurasi file penulisan untuk meneruskan variabel sesi ke wadah Docker. Konfigurasi ini melewati POSTGRES_USER
variabel ke lingkungan build dan lingkungan runtime, dan menetapkan nilai default jika tidak ada.
version: '3.1' services: my-service: build: context: . args: - POSTGRES_USER=${POSTGRES_USER:-default} environment: - POSTGRES_USER=${POSTGRES_USER:-default}
Anda perlu mengatur variabel lingkungan sebelum menjalankan docker-compose up
, jika tidak maka tidak akan dapat mengaksesnya. Anda dapat menyimpannya di file penulisan, tetapi itu biasanya dilacak dan diversi, yang mengalahkan tujuan variabel env.
Dengan Kubernetes
Kubernetes adalah sistem orkestrasi yang dapat menangani ratusan container yang dijalankan di seluruh jaringan. Itu masih menggunakan Docker, tetapi Anda hanya akan menyentuh konfigurasi, jadi meneruskan variabel lingkungan secara langsung tidak akan berfungsi.
Sebagai gantinya, Anda dapat mendefinisikannya dalam konfigurasi untuk Pod:
apiVersion: v1 kind: Pod metadata: name: example spec: containers: - ... env: - name: SERVICE_PORT value: "80" - name: SERVICE_IP value: "172.17.0.1"
Kubernetes rumit, dan ada banyak cara berbeda untuk bekerja dengan variabel lingkungan. Untuk mempelajari lebih lanjut, Anda dapat membaca panduan mereka tentang memasukkan data ke dalam Pod.