Docker CLI çıktısını yalnızca ihtiyacınız olan alanlara indirmek için --format, listeyi belirli koşullara uyan kayıtlara daraltmak için --filter bayrağını kullanırsınız. --format Go şablonları (Go templates) alır: docker ps --format '{{.Names}}' gibi bir ifade her satır için yalnızca container adını yazar, --format json ise çıktıyı JSON olarak verir. --filter ise anahtar=değer biçiminde bir koşul bekler; örneğin docker images --filter reference=alpine yalnızca alpine imajlarını listeler.
Bu iki bayrak, sunucuda betik yazarken ve uzun listelerde aradığınızı bulurken en çok işe yarayan CLI özellikleridir. Yazıda resmî belgelerdeki şablon fonksiyonlarını (join, table, json, lower, split, title, upper, pad, truncate, println), kabukta tırnak kullanımını, filtrelerin nasıl birleştiğini ve olumsuz etiket filtrelerindeki tuzağı örneklerle anlatıyoruz. Filtrelerin en tehlikeli kullanım alanı olan temizlik komutları için Docker prune yazısına, serinin tamamı için Docker öğrenme rehberine bakabilirsiniz.
--format ve Go şablonları
Docker, bazı komutların ve log sürücülerinin çıktısını biçimlendirmek için Go şablonlarını destekler. Şablonda çift süslü parantez içindeki {{.Alan}} ifadesi, o kaydın ilgili alanıyla değiştirilir. Belgelerdeki örneklerin çoğu docker inspect üzerinden verilir, ama --format bayrağı container, imaj, volume, ağ listeleri, docker stats, docker system df ve docker info gibi pek çok komutta vardır.
Belgelerdeki somut bir örnek varsayılan log sürücüsünü bulmaktır. docker info uzun bir çıktı verir; şablonla yalnızca tek alanı alırsınız. Belgede gösterilen çıktı varsayılan sürücü olan json-file değeridir:
docker info --format '{{.LoggingDriver}}'
json-fileHangi alanların kullanılabileceğini bilmiyorsanız belgelerin ipucu şudur: kaydın tamamını JSON olarak yazdırın, alan adlarını oradan okuyun.
docker container ls --format='{{json .}}'Engine 23.0.0 ile --format destekleyen tüm komutlara --format=json kısaltması eklendi; bu, --format="{{ json . }}" yazmanın kısa yoludur. Çıktıyı jq gibi bir araçla işleyecekseniz en temiz seçenek budur.
Kabukta tırnak kullanımı
Şablonlar süslü parantez ve çift tırnak içerdiği için kabuğun bunları yorumlamasını engellemeniz gerekir. Belgelere göre POSIX kabuklarında (bash, sh, zsh) şablonu tek tırnak içine almanız yeterlidir. Windows PowerShell'de de tek tırnak kullanılır, ancak şablonun içindeki çift tırnakların ters eğik çizgiyle kaçırılması gerekir:
docker inspect --format '{{join .Args " , "}}' containerdocker inspect --format '{{join .Args \" , \"}}' containerİlki Linux sunucuda, ikincisi PowerShell'de kullanılacak biçimdir. Bir betikte şablon çalışmıyorsa ilk bakılacak yer genellikle tırnaklardır.
Şablon fonksiyonları

Docker, şablon öğelerini işlemek için bir dizi temel fonksiyon sağlar. Belgelerde listelenen fonksiyonlar şunlardır:
| Fonksiyon | Ne yapar | Örnek |
|---|---|---|
| join | Bir dize listesini aralarına ayraç koyarak tek dizeye çevirir | {{join .Args " , "}} |
| table | Çıktıyı başlıklı sütunlar halinde, seçtiğiniz alanlarla verir | table {{.ID}}\t{{.Repository}} |
| json | Bir öğeyi JSON dizesi olarak kodlar | {{json .Mounts}} |
| lower | Dizeyi küçük harfe çevirir | {{lower .Name}} |
| upper | Dizeyi büyük harfe çevirir | {{upper .Name}} |
| title | Dizenin ilk karakterini büyük harf yapar | {{title .Name}} |
| split | Dizeyi ayraca göre bir listeye böler | {{split .Image ":"}} |
| pad | Dizenin önüne ve arkasına belirtilen sayıda boşluk ekler | {{pad .Repository 5 10}} |
| truncate | Dizeyi belirtilen uzunluğa kısaltır; kısaysa olduğu gibi bırakır | {{truncate .Repository 15}} |
| println | Her değeri yeni satıra yazar | {{println .IPAddress}} |
table ile okunabilir listeler
table önekiyle başlayan bir şablon, sütun başlıklarını korur ve yalnızca seçtiğiniz alanları gösterir. Sütunları ayırmak için \t sekme karakteri kullanılır. Belgelerdeki örnek imaj listesini dört sütuna indirir:
docker image list --format "table {{.ID}}\t{{.Repository}}\t{{.Tag}}\t{{.Size}}"Engine 29.0.0 ile docker image ls varsayılan olarak yeni bir görünüm kullanmaya başladı ve etiketsiz imajları --all verilmedikçe göstermiyor. Kendi --format şablonunuzu verdiğinizde sütunları siz seçtiğiniz için betiklerinizin varsayılan görünümdeki değişikliklerden etkilenmesi azalır.
json, range ve println ile iç içe veri
docker inspect çıktısındaki bazı alanlar listeler ya da haritalardır. Bunları olduğu gibi görmek için json, tek tek dolaşmak için Go şablonlarının range yapısı kullanılır. Belgelerdeki iki örnek, bir container'ın bağlama noktalarını JSON olarak ve bağlı olduğu her ağdaki IP adresini ayrı satırda yazar:
docker inspect --format '{{json .Mounts}}' container
docker inspect --format='{{range .NetworkSettings.Networks}}{{println .IPAddress}}{{end}}' containerPort yayınlama belgesinde de aynı yöntemle bir container'ın port eşlemeleri incelenir. Belgede gösterilen çıktıda IPv4 için 0.0.0.0 üzerinde 8080 portu, IPv6 için ise ana makine portu olmayan bir kayıt görünür:
docker container inspect <id> --format "{{json .NetworkSettings.Ports}}"
{"80/tcp":[{"HostIp":"0.0.0.0","HostPort":"8080"},{"HostIp":"::","HostPort":""}]}Bu çıktının ayrıntıları ve 127.0.0.1 üzerine yayınlama port yayınlama yazısında anlatılıyor.
Container durumu ve sağlık bilgisi
Sunucuda en sık yapılan iş container'ların durumuna bakmaktır. Engine 20.10.0 ile docker ps --format için bir .State alanı eklendi; bu alan çalışma süresi ve healthcheck ayrıntısı olmadan yalnızca container'ın durumunu verir. Engine 29.5.0 ile de .HealthStatus alanı geldi; container'ın sağlık durumunu (starting, healthy, unhealthy) ayrı bir alan olarak yazar.
docker ps --format 'table {{.Names}}\t{{.State}}\t{{.HealthStatus}}'Healthcheck tanımlamanın yolu için Docker Compose rehberindeki healthcheck bölümüne bakabilirsiniz.
Log etiketlerinde şablon kullanımı
Go şablonları yalnızca CLI çıktısında değil log sürücülerinde de kullanılır. tag log seçeneği, bir container'ın log mesajlarını tanımlayan etiketi biçimlendirir; varsayılan değer container kimliğinin ilk 12 karakteridir. Belgelerdeki işaretlemeler {{.ID}}, {{.FullID}}, {{.Name}}, {{.ImageID}}, {{.ImageFullID}}, {{.ImageName}} ve {{.DaemonName}} değerlerini kapsar. Örneğin --log-opt tag="{{.ImageName}}/{{.Name}}/{{.ID}}" değeri syslog satırlarında imaj adı, container adı ve kısa kimliği bir arada gösterir.
Bir ayrıntıya dikkat edin: {{.Name}} değeri container başlarken belirlenir. Container'ı sonradan docker rename ile yeniden adlandırırsanız log mesajları eski adı kullanmaya devam eder. Log sürücüleri ve boyut sınırları için Docker log boyutu yazısına bakın.
--filter ile çıktıyı daraltmak

--filter bayrağı bir işleç ile ayrılmış anahtar-değer çifti bekler. Anahtar filtrelemek istediğiniz alanı, değer o alanın eşleşmesi gereken deseni belirtir. İşleç eşittir (=) veya eşit değildir (!=) olabilir.
docker COMMAND --filter "KEY=VALUE"Belgelerdeki örnekte önce tüm imajlar listelenir, sonra yalnızca alpine imajları süzülür:
docker images --filter reference=alpine
REPOSITORY TAG IMAGE ID CREATED SIZE
alpine 3.21 a8cbb8c69ee7 40 minutes ago 8.67MB
alpine latest 7144f7bab3d4 40 minutes ago 11.7MBKullanılabilen anahtarlar komuta göre değişir. Bazı filtreler tam eşleşme ister, bazıları kısmi eşleşmeyi kabul eder, bazıları düzenli ifade kullanmanıza izin verir. Hangi komutun hangi anahtarları desteklediği o komutun CLI başvuru sayfasında yazılıdır. Belgelerde --filter destekleyen komutlar arasında docker container ls, docker image ls, docker volume ls, docker network ls, tüm prune komutları, docker search ve Swarm tarafında docker service ls, docker node ls gibi komutlar sayılır.
Birden fazla filtre: VEYA mantığı
Birden fazla --filter bayrağı verebilirsiniz. Belgelerdeki örnekte aynı anahtar için verilen iki filtre mantıksal VEYA gibi davranır: hem alpine:latest hem de tüm busybox imajları listelenir.
docker images --filter reference=alpine:latest --filter=reference=busybox
REPOSITORY TAG IMAGE ID CREATED SIZE
alpine latest 7144f7bab3d4 2 hours ago 11.7MB
busybox uclibc 3e516f71d880 2 hours ago 2.4MB
busybox glibc 7338d0c72c65 2 hours ago 6.09MBOlumsuz etiket filtrelerindeki tuzak
Bazı komutlar etiketlere (label) göre olumsuz filtreleri destekler; bunlar yalnızca desene uymayan kayıtları dikkate alır. Aşağıdaki komut foo etiketi olmayan tüm durmuş container'ları siler:
docker container prune --filter "label!=foo"Birden fazla olumsuz etiket filtresini birleştirdiğinizde ise sonuç tek bir olumsuz koşuldur, yani mantıksal VE. Belgelerin uyarısı şudur: aşağıdaki komut yalnızca hem foo hem bar etiketine sahip container'ları korur. Yalnızca birine sahip olanlar silinir.
docker container prune --filter "label!=foo" --filter "label!=bar"Etiketlerle filtreleme
Filtrelerin asıl gücü etiketlerle birlikte ortaya çıkar. Etiketler imajlara, container'lara, yerel daemon'lara, volume'lara, ağlara, Swarm node'larına ve servislerine eklenebilen anahtar-değer çiftleridir. Belgeler anahtar adları için ters DNS gösterimini (com.example.some-label) önerir; com.docker.*, io.docker.* ve org.dockerproject.* ad alanları Docker'a ayrılmıştır. İmaj, container, daemon, volume ve ağ etiketleri nesnenin ömrü boyunca sabittir; değiştirmek için nesneyi yeniden oluşturmanız gerekir.
docker run --label "com.example.env=prod" myapp
docker container ls --filter "label=com.example.env=prod"
docker inspect --format='{{json .Config.Labels}}' mycontainerCompose ile oluşturulan container'lar kendiliğinden etiket taşır: com.docker.compose.project proje adını, com.docker.compose.service servis adını tutar. Bu sayede bir Compose projesine ait container'ları --filter "label=com.docker.compose.project=PROJE" ile süzebilirsiniz. Compose dosyasında com.docker.compose önekiyle kendiniz etiket tanımlamaya çalışmak ise çalışma zamanı hatasına yol açar.
Uygulamalı örnek: bir Compose projesini incelemek
Şimdiye kadar anlatılanları bir sunucu senaryosunda birleştirelim. Diyelim ki blog adlı bir Compose projeniz var ve hangi container'ların sağlıksız olduğunu, hangi volume'ların veritabanına ait olduğunu hızlıca görmek istiyorsunuz. İlk komut Compose'un otomatik eklediği proje etiketiyle süzer, ardından yalnızca ad, durum ve sağlık alanlarını tablo olarak yazar:
docker ps --filter "label=com.docker.compose.project=blog" \
--format 'table {{.Names}}\t{{.State}}\t{{.HealthStatus}}'Burada --filter kayıtları daraltır, --format ise kalan kayıtların nasıl yazılacağını belirler; iki bayrak birbirinden bağımsız çalışır ve birlikte kullanılabilir. İkinci adımda etiket belgesindeki yöntemle amacı etiketlenmiş volume'ları bulur, sonra birinin etiketlerini JSON olarak okursunuz:
docker volume ls --filter "label=com.example.purpose"
docker volume inspect myvolume --format='{{json .Labels}}'Aynı yaklaşım ağlar için de geçerlidir: docker network ls --filter "label=com.example.purpose" ve docker network inspect mynetwork --format='{{json .Labels}}'. Etiketleri baştan düzenli koyarsanız, listeleme, izleme ve temizlik komutlarının hepsini aynı etiketlerle hedefleyebilirsiniz. Etiket değerlerinin her zaman dize olarak saklandığını da unutmayın; belgelere göre Docker değeri ayrıştırmadığı için içine JSON koysanız bile filtrelerde onu iç içe bir yapı gibi sorgulayamazsınız.
Sık yapılan hatalar

- Şablonu çift tırnakla yazıp kabuğun içindeki tırnakları bozmasına izin vermek. Linux'ta tek tırnak kullanın.
- PowerShell'de içteki çift tırnakları kaçırmayı unutmak.
- Alan adlarını tahmin etmek. Önce
--format='{{json .}}'ile kaydın tamamına bakın. - Varsayılan tablo görünümünü ayrıştıran betikler yazmak. Engine 29.0.0'da
docker image lsgörünümü değişti; betiklerde--formatveya--format jsonkullanın. - Aynı anahtar için iki filtrenin VE gibi çalıştığını sanmak. Örnekteki
referencefiltreleri VEYA gibi davranır. - Olumsuz etiket filtrelerini birleştirip daha fazlasını koruduğunuzu sanmak. Birleşik olumsuz filtreler VE mantığıyla çalışır ve beklediğinizden fazlasını silebilir.
Sık Sorulan Sorular
Yalnızca container adlarını nasıl listelerim?
docker ps --format '{{.Names}}' her satıra bir container adı yazar. Başlıklı bir tablo isterseniz şablonun başına table ekleyin.
Bir container'ın IP adresini nasıl alırım?
Belgelerdeki örnek docker inspect --format='{{range .NetworkSettings.Networks}}{{println .IPAddress}}{{end}}' container komutudur; container birden fazla ağa bağlıysa her IP ayrı satıra yazılır.
Hangi komut hangi filtreleri destekliyor?
Desteklenen anahtarlar komuta göre değişir ve her komutun CLI başvuru sayfasında listelenir. Yerelde docker <komut> --help çıktısı da bayrağın varlığını ve örnek bir değeri gösterir.
Filtre değerinde düzenli ifade kullanabilir miyim?
Belgelere göre bazı filtreler düzenli ifadeye izin verir, bazıları tam eşleşme ister. Bu, filtreye ve komuta bağlıdır; kullandığınız komutun başvuru sayfasına bakın.
JSON çıktısındaki alanlar Docker sürümüyle değişebilir mi?
Evet, bu yüzden betiklerinizi güncellemelerden sonra kontrol edin. Örneğin Engine 29.0.0 sürüm notlarına göre docker image ls JSON biçiminde kullanıldığında çıktıdan VirtualSize alanı kaldırıldı. Bu alana dayanan bir betik, güncellemeden sonra boş değer almaya başlar. Sürüm notlarını okumak ve kritik betikleri bir test sunucusunda denemek bu tür sürprizleri önler.
Marka adları sahiplerine aittir. Bu yazı bağımsız bir teknik rehberdir; adı geçen kuruluşlarla bayilik veya ortaklık ilişkisi bulunduğu anlamına gelmez.
İlgili içerikler: Docker öğrenme rehberi · Docker prune · docker stats · Docker context · Linux loglarını okuma