Karmaşık Görüntü Oluşturma İşlem Hatları Oluşturmak için Docker Buildx Bake Nasıl Kullanılır

Yayınlanan: 2022-08-10

Docker logosunu gösteren grafik

docker buildx komut grubu, gelişmiş görüntü oluşturma yeteneklerini ortaya çıkarmak için BuildKit'i kullanır. Pişmiş derlemeler, otomatikleştirilmiş derleme işlem hatlarını tanımlamak için kullanılabilecek üst düzey bir özelliktir. Tek bir oluşturma işleminden birden çok görüntü oluşturmanıza olanak tanır.

Hazır iş akışları, resimlerinizin farklı türevlerini yayınlamak veya paralel olarak birkaç bağlantılı proje oluşturmak istediğinizde yardımcı olur. Bu makalede, docker buildx bake temel özelliklerini ve bunları karmaşık yapıları kolaylaştırmak için nasıl kullanabileceğinizi ele alacağız.

Başlarken

docker buildx bake komutu, her biri bir kapsayıcı görüntüsü oluşturan birden çok derleme "hedefi" yürütür. Performansı en üst düzeye çıkarmak için hedefler paralel olarak çalışır. Hedefler, sıralı boru hatları oluşturmak için doğrudan öncüllere de başvurabilir.

Derleme hedefleri, mevcut Docker Compose dosyaları dahil olmak üzere birkaç farklı mekanizma kullanılarak tanımlanabilir. Buildx, dosyada tanımlanan tüm görüntüleri otomatik olarak oluşturacaktır.

JSON veya HCL dosyalarında derleme hedeflerini listelediğinizde daha gelişmiş özellikler ortaya çıkar. Bunlar, yapılarınızı özelleştirmek için değişkenleri, işlevleri ve değer enterpolasyonunu destekler.

buildx bake komutu aşağıdaki dosyaları sırayla arar:

  • docker-compose.yml
  • docker-compose.yaml
  • docker-bake.json
  • docker-bake.override.json
  • docker-bake.hcl
  • docker-bake.override.hcl

-f komut bayrağıyla farklı bir dosya belirtebilirsiniz.

Hedef Oluştur

Derleme hedefleri, yapınızla ilgili tüm yapılandırmayı kapsar. gibi ayrıntıları içerirler.

  • inşa edilecek Dockerfile yolu
  • Dockerfile'ınızda bulunan içeriği tanımlayarak bağlam yolları oluşturun
  • çıktı görüntülerine eklenecek etiketler ve etiketler
  • için görüntü üretecek platformlar.

Desteklenen yapılandırma alanlarının tam listesi belgelerde mevcuttur. Daha önce bu ayarları docker buildx build (hatta düz docker build ) komut satırı bayrakları olarak vermiş ve sizi her seferinde doğru değerleri hatırlamaya zorlamış olabilirsiniz. buildx bake ile sürüm kontrollü fırınlanmış dosyanızda tanımlayarak aynı değerleri güvenilir bir şekilde kullanabilirsiniz.

Tek bir derleme hedefi tanımlayan docker-bake.hcl komutunun basit bir örneğini burada bulabilirsiniz:

 target "default" { dockerfile = "app/Dockerfile" contexts = { app = "app/src" shared = "shared-components/src" } tags = ["my-app:latest", "docker.io/my-org/my-app:latest"] }

docker buildx bake bake dosyasını bu fırın dosyasıyla çalıştırmak, app/Dockerfile Dockerfile dosyasını çalışma dizininizden yükler. Derleme bağlamları olarak app/src ve shared-components/src dizinlerine erişimi olacaktır. Üretilen görüntüye iki etiket atanacaktır.

docker buildx bake çalıştırdığınızda default hedef otomatik olarak oluşturulur. İsteğe bağlı olarak oluşturulabilecek adlandırılmış hedefler de tanımlayabilirsiniz:

 target "app" { // ... }
 $ docker buildx bake app

Birden Fazla Hedef Kullanma

Fırın dosyanızın içinde yeni bir hedef olarak tanımlayarak aynı anda başka bir görüntü oluşturabilirsiniz:

 group "default" { targets = ["app", "api"] } target "app" { dockerfile = "app/Dockerfile" contexts = { app = "app/src" shared = "shared-components/src" } tags = ["my-app:latest", "docker.io/my-org/my-app:latest"] } target "api" { dockerfile = "api/Dockerfile" contexts = { src = "api/src" } tags = ["my-api:latest", "docker.io/my-org/my-api:latest"] }

Bu görüntüler, bir grup içinde iç içe oldukları için aynı anda oluşturulabilir. default grup otomatik olarak seçildiğinden, docker buildx bake komutunu her çalıştırdığınızda api ve app görüntüleri paralel olarak oluşturulacaktır. Yukarıdaki adlandırılmış hedefler örneğine benzer şekilde adlandırılmış grupları kullanabilirsiniz.

Hedef Kalıtım Oluştur

Yapı hedefleri, yapılandırmayı yeniden kullanmak için birbirlerinden devralabilir. Bunun yararlı olabileceği bir senaryo, farklı ortamlar için özelleştirilmesi gereken görüntülerle ilgilidir. Geliştirme kullanımına yönelik görüntü türevlerine fazladan yapılandırma dosyaları eklemek isteyebilirsiniz. İşte bu modeli gösteren bir docker-bake.hcl :

 group "default" { targets = ["backend", "backend-dev"] } target "backend" { dockerfile = "backend/Dockerfile" contexts = { src = "api/src" config = "api/config" } tags = ["backend:latest"] } target "backend-dev" { inherits = ["backend"] contexts = { config = "api/config-dev" } tags = ["backend:dev"] }

backend-dev geliştirme hedefi, backend hedefinin tüm özelliklerini devralır ancak config bağlamını geçersiz kılar ve farklı bir etiket uygular.

--print bayrağıyla bake komutunu çalıştırarak birleştirilmiş dosya yapısını önizleyebilirsiniz:

 $ docker buildx bake --print ... "backend-dev": { "context": ".", "contexts": { "config": "api/config-dev", "src": "api/src" }, "dockerfile": "backend/Dockerfile", "tags": [ "backend:dev" ] } ...

Temel Görüntü Olarak Önceki Bir Hedefi Kullanma

Bazen bir yapı hedefinin, önceki bir hedef tarafından oluşturulan görüntüyü kendi tabanı olarak kullanmasını isteyebilirsiniz. Bu, Dockerfile'larınız birbirine bağlı olduğunda kullanılabilecek, ancak belki de farklı projelerde bulundukları için birleştirilemediğinde kullanılabilecek çok aşamalı yapılara bir alternatiftir.

 group "default" { targets = ["org-base-image", "api"] } target "org-base-image" { dockerfile = "docker-base/Dockerfile" tags = ["org-base-image:latest"] } target "api" { dockerfile = "api/Dockerfile" contexts = { base = "target:org-base-image" } tags = ["api:latest"] }

Örnek önce org-base-image hedefini oluşturur. Bu, kuruluşunuzun kapsayıcılı iş yüklerinde ortak olan bazı yardımcı programları içerebilir. api hedefi daha sonra, base yapı bağlamı olarak erişilebilen org-base-image hedefinden elde edilen çıktı ile oluşturulur. API Dockerfile artık temel görüntünün içindeki içeriğe başvurabilir:

 COPY --from=base /utilities/example /usr/bin/example-utility

Bu, ayrı Docker dosyalarını korurken görüntüler arasında bağımlılık bağlantıları oluşturmanıza olanak tanıyan güçlü bir kalıptır.

Oluşturma Zamanında Hedeflerin Özelliklerini Geçersiz Kılma

docker buildx bake komutu, derlemenizi çalıştırdığınızda hedeflerinizin özelliklerini geçersiz kılmanıza olanak tanır:

 $ docker buildx bake --set api.dockerfile="api/Dockerfile-dev"

Bu örnek, api hedefinin Dockerfile dosyasını değiştirir. * joker karakteri, değiştirilecek hedef belirlenirken desteklenir. * kendi başına her hedefi seçer, api* ile api tüm hedefleri değiştirir.

Değişkenleri Ayarlama

HCL dosyaları, derleme hedeflerinizde başvurabileceğiniz değişkenleri tanımlayabilir. bunları ayarlamak için variable bir blok kullanın:

 variable "TAG" { default = "latest" } group "default" { targets = ["app"] } target "app" { dockerfile = "src/Dockerfile" tags = ["my-app:${TAG}"] }

docker buildx bake bu yapılandırmayla çalıştırmak, app hedefini my-app:latest olarak etiketleyecektir. Komutu çalıştırmadan önce bir ortam değişkeni ayarlayarak TAG değişkeninin değerini değiştirebilirsiniz:

 $ TAG=v1 docker buildx bake

Yapı hedeflerinizi yeniden kullanılabilir hale getirmek için HCL dilinin tüm değişken enterpolasyon ve karşılaştırma yeteneklerini kullanabilirsiniz. Değerlerinizi ayrıştırmak ve dönüştürmek için işlevler de mevcuttur.

Özet

Baked Buildx derlemeleri, bir dosyada tanımlanan "hedefler" olarak görüntü oluşturma yapılandırmasını kapsüllemenize olanak tanır. buildx bake çalıştırdığınızda, başvurulan tüm hedefler için görüntüler paralel olarak oluşturulur.

Hedefler birbirlerinden miras alabilir ve birbirlerine bağımlı olabilir. Son derece karmaşık ve yapılandırılabilir yapı işlem hatları oluşturmak için değişkenleri ve işlevleri de kullanabilirsiniz.

docker buildx bake komutu, her iş akışında gerekli olmayan üst düzey bir işlemdir. Projeler arası bağımlılık olmadan basit görüntüler oluştururken kullanmanıza gerek yoktur. Docker docker compose build build'i kullanmak, derleme yapılandırmasını docker-compose.yml dosyanızda tutan çoğu kullanım durumu için daha iyi bir alternatiftir. Farklı değişkenler, platformlar, yapı bağlamları ve yapılandırma geçersiz kılmaları kullanarak aynı anda birçok görüntü oluştururken, hazır yapılara geçiş düşünülmelidir.