Docker Ortam Değişkenleri Nedir ? Nasıl Ayarlanır ?

 


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 şifresi
  • MYSQL_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.

Daha yeni Daha eski