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 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.