Docker Environment Variables (Ortam Değişkenleri) Nedir?
Docker ile çalışırken uygulamalarımızın bazı ayarlarını doğrudan kodun içerisine yazmak yerine Environment Variable (Ortam Değişkeni) olarak vermek oldukça kullanışlıdır.
Örneğin bir MySQL container'ı çalıştırırken root kullanıcısının şifresini container'a bir environment variable olarak gönderebiliriz.
Docker'da environment variable vermek için -e parametresini kullanıyorum.
docker run -e MYSQL_ROOT_PASSWORD=my-secret-pw mysql
Burada:
- -e → Container'a environment variable göndermemizi sağlar.
- MYSQL_ROOT_PASSWORD → Environment variable'ın adıdır.
- my-secret-pw → Bu değişkene verdiğimiz değerdir.
- mysql → Çalıştıracağımız Docker image'ıdır.
Yani aslında Docker'a şunu söylemiş oluyoruz: MySQL container'ını çalıştır ve içerisinde MYSQL_ROOT_PASSWORD isimli bir ortam değişkeni oluştur.
Environment Variable Neden Kullanılır?
Environment variable kullanımının en önemli avantajlarından biri, uygulamanın ayarlarını koddan ayırabilmemizdir.
Örneğin uygulamamızın development, test ve production ortamlarında farklı veritabanlarına bağlandığını düşünelim. Veritabanı adresini doğrudan kodun içerisine yazmak yerine environment variable kullanabiliriz.
DB_HOST=localhost DB_PORT=3306 DB_USERNAME=root DB_PASSWORD=my-password
Bu şekilde aynı uygulama kodunu değiştirmeden farklı ortamlarda farklı değerlerle çalıştırabiliriz.
Örneğin development ortamında:
DB_HOST=localhost
Production ortamında ise:
DB_HOST=production-db
kullanabiliriz.
Böylece uygulamanın kodunu değiştirmeden sadece ortam değişkenlerini değiştirerek farklı ortamlara uyum sağlayabiliriz.
Docker Container'a Birden Fazla Environment Variable Vermek
Bir container çalıştırırken birden fazla environment variable da verebiliriz.
docker run \ -e MYSQL_ROOT_PASSWORD=my-secret-pw \ -e MYSQL_DATABASE=mydatabase \ -e MYSQL_USER=myuser \ -e MYSQL_PASSWORD=mypassword \ mysql
Bu örnekte MySQL container'ına dört farklı environment variable gönderiyoruz.
MYSQL_ROOT_PASSWORD→ Root kullanıcısının şifresiMYSQL_DATABASE→ Oluşturulacak veritabanının adıMYSQL_USER→ Oluşturulacak kullanıcıMYSQL_PASSWORD→ Oluşturulacak kullanıcının şifresi
Burada dikkat edilmesi gereken nokta, hangi environment variable'ların kullanılacağının çalıştırdığımız image'a bağlı olmasıdır. Her Docker image'ı aynı environment variable'ları desteklemez. Örneğin MySQL image'ı kendisine özel bazı environment variable'lar kullanır.
Container İçerisindeki Environment Variable'ları Görmek
Container çalıştıktan sonra içerisinde hangi environment variable'ların bulunduğunu görmek için container'ın terminaline bağlanabiliriz.
docker exec -it containerName /bin/bash
Daha sonra Linux'taki env komutu ile environment variable'ları listeleyebiliriz.
env
Belirli bir değişkeni görmek istersek echo komutunu da kullanabiliriz.
echo $MYSQL_ROOT_PASSWORD
Bu şekilde container içerisinde MYSQL_ROOT_PASSWORD değişkenine hangi değerin verildiğini görebiliriz.
Docker Inspect ile Environment Variable'ları Görmek
Environment variable'ları container'ın dışından da kontrol edebiliriz. Bunun için daha önce bahsettiğimiz docker inspect komutunu kullanabiliriz.
docker inspect containerName
Çıktı içerisinde container'a ait environment variable bilgilerini de görebiliriz.
Bu nedenle environment variable içerisine şifre, API key veya başka hassas bilgiler koyarken dikkatli olmak gerekir. Docker inspect çıktısına erişebilen bir kullanıcı bu değerleri görebilir.
Environment Variable'ı Host'tan Almak
Environment variable değerini doğrudan komut içerisinde yazmak yerine Docker Host üzerinde bulunan bir değişkenden de alabiliriz.
Örneğin host üzerinde:
export MYSQL_PASSWORD=my-secret-pw
şeklinde bir değişken oluşturduktan sonra bunu container'a aktarabiliriz.
docker run -e MYSQL_ROOT_PASSWORD=$MYSQL_PASSWORD mysql
Burada $MYSQL_PASSWORD ifadesi host üzerinde tanımladığımız environment variable'ın değerini temsil eder.
Docker Compose ile Environment Variable Kullanımı
Container sayısı arttığında bütün docker run komutlarını tek tek yazmak yerine Docker Compose kullanmak daha pratik hale geliyor.
Docker Compose içerisinde environment variable'ları environment alanında tanımlayabiliriz.
services: mysql: image: mysql environment: MYSQL_ROOT_PASSWORD: my-secret-pw MYSQL_DATABASE: mydatabase MYSQL_USER: myuser MYSQL_PASSWORD: mypassword
Bu yapı sayesinde container'ın hangi environment variable'lar ile çalışacağını Compose dosyası üzerinden belirleyebiliriz.
.env Dosyası Kullanmak
Şifre ve benzeri değerleri doğrudan docker-compose.yml içerisine yazmak yerine at .env dosyasında tutmak da mümkündür. docker-compose.yml ile aynı dizinde bir .env dosyası açıp içerisine örnek olarak şu tanımlamaları yapıyoruz.
MYSQL_ROOT_PASSWORD=my-secret-pw MYSQL_DATABASE=mydatabase MYSQL_USER=myuser MYSQL_PASSWORD=mypassword
Daha sonra Compose dosyasında bu değişkenleri kullanabiliriz.
services: mysql: image: mysql environment: MYSQL_ROOT_PASSWORD: ${MYSQL_ROOT_PASSWORD} MYSQL_DATABASE: ${MYSQL_DATABASE} MYSQL_USER: ${MYSQL_USER} MYSQL_PASSWORD: ${MYSQL_PASSWORD}
Bu yöntemin güzel tarafı, Compose dosyasının yapısını değiştirmeden farklı ortamlarda farklı değerler kullanabilmemizdir.
Environment Variable ile Secret Aynı Şey Değildir
Burada önemli bir noktaya da dikkat etmek gerekiyor. Environment variable kullanmak, bilgileri otomatik olarak güvenli hale getirmez.
Örneğin:
docker run -e DB_PASSWORD=my-secret-password mysql
şeklinde bir kullanım şifreyi kod dosyasına yazmaktan daha kullanışlı olabilir ancak bu şifrenin güvenli bir secret management sistemi içerisinde saklandığı anlamına gelmez.
Özellikle production ortamlarında gerçek şifreler, API anahtarları ve benzeri hassas bilgilerin nasıl yönetileceğine ayrıca dikkat etmek gerekir.
Docker Environment Variable Komutlarının Kısa Özeti
| Komut / Kullanım | Açıklama |
|---|---|
docker run -e KEY=value image |
Container'a environment variable gönderir. |
env |
Container içerisindeki environment variable'ları listeler. |
echo $KEY |
Belirli bir environment variable'ın değerini gösterir. |
docker inspect containerName |
Container yapılandırması içerisindeki environment bilgilerini gösterir. |
environment: |
Docker Compose içerisinde environment variable tanımlamak için kullanılır. |
${KEY} |
Compose dosyasında environment variable değerini kullanmayı sağlar. |
Sonuç
Docker'da environment variable kullanımı, container'ların yapılandırmasını uygulama kodundan ayırmak için oldukça kullanışlı bir yöntem. Özellikle veritabanı bilgileri, uygulama ayarları, portlar ve farklı ortamlarda değişmesi gereken değerler için bu yöntemi kullanabiliriz.
Benim açımdan en önemli nokta ise şu: Container'ın kendisini değiştirmek yerine, container'ı çalıştırırken ihtiyaç duyduğu değerleri dışarıdan vermek. Böylece aynı image'ı development, test ve production gibi farklı ortamlarda farklı ayarlarla kullanabiliyoruz.
