Docker görüntüleri oluşturmanın nasıl hızlandırılacağına ilişkin bazı ipuçları. Örneğin 30 saniyeye kadar

Bir özelliğin üretime geçmesinden önce, karmaşık orkestratörlerin ve CI/CD'nin olduğu günümüzde, taahhütten testlere ve teslimata kadar gidilecek uzun bir yol var. Önceden, yeni dosyaları FTP yoluyla yükleyebiliyordunuz (artık bunu kimse yapmıyor, değil mi?) ve "dağıtım" süreci birkaç saniye sürüyordu. Artık birleştirme isteği oluşturup özelliğin kullanıcılara ulaşması için uzun süre beklemeniz gerekiyor.

Bu yolun bir kısmı Docker görüntüsü oluşturmaktır. Toplantı bazen dakikalarca, bazen onlarca dakika sürüyor ki buna normal denilemez. Bu makalede, bir görüntüye paketleyeceğimiz basit bir uygulamayı ele alacağız, derlemeyi hızlandırmak için çeşitli yöntemler uygulayacağız ve bu yöntemlerin nasıl çalıştığına ilişkin nüanslara bakacağız.

Docker görüntüleri oluşturmanın nasıl hızlandırılacağına ilişkin bazı ipuçları. Örneğin 30 saniyeye kadar

Medya web siteleri oluşturma ve destekleme konusunda iyi deneyime sahibiz: TASS, Bell, Novaya Gazeta, cumhuriyet… Kısa bir süre önce bir ürün web sitesi yayınlayarak portföyümüzü genişlettik Hatırlatma. Yeni özellikler hızla eklenirken ve eski hatalar düzeltilirken, yavaş dağıtım büyük bir sorun haline geldi.

GitLab'a dağıtıyoruz. Görüntüleri topluyoruz, GitLab Registry'ye gönderiyoruz ve üretime sunuyoruz. Bu listedeki en uzun şey görüntülerin birleştirilmesidir. Örneğin: optimizasyon olmadan her arka uç derlemesi 14 dakika sürdü.

Docker görüntüleri oluşturmanın nasıl hızlandırılacağına ilişkin bazı ipuçları. Örneğin 30 saniyeye kadar

Sonunda artık böyle yaşayamayacağımız anlaşıldı ve görüntülerin toplanmasının neden bu kadar uzun sürdüğünü anlamak için oturduk. Sonuç olarak montaj süresini 30 saniyeye indirmeyi başardık!

Docker görüntüleri oluşturmanın nasıl hızlandırılacağına ilişkin bazı ipuçları. Örneğin 30 saniyeye kadar

Bu yazı için Reminder ortamına bağlı kalmamak için boş bir Angular uygulamasının birleştirilmesi örneğine bakalım. O halde uygulamamızı oluşturalım:

ng n app

Buna PWA'yı ekleyin (biz ilericiyiz):

ng add @angular/pwa --project app

Bir milyon npm paketi indirilirken gelin docker imajının nasıl çalıştığını bulalım. Docker, uygulamaları paketleme ve bunları konteyner adı verilen yalıtılmış bir ortamda çalıştırma olanağı sağlar. İzolasyon sayesinde birçok konteyneri aynı anda tek bir sunucuda çalıştırabilirsiniz. Konteynerler sanal makinelerden çok daha hafiftir çünkü doğrudan sistem çekirdeği üzerinde çalışırlar. Uygulamamızla bir konteyner çalıştırmak için öncelikle uygulamamızın çalışması için gerekli olan her şeyi paketleyeceğimiz bir imaj oluşturmamız gerekiyor. Temel olarak, bir görüntü dosya sisteminin bir kopyasıdır. Örneğin Dockerfile'ı alın:

FROM node:12.16.2
WORKDIR /app
COPY . .
RUN npm ci
RUN npm run build --prod

Dockerfile bir dizi talimattır; Docker, bunların her birini gerçekleştirerek değişiklikleri dosya sistemine kaydedecek ve bunları öncekilerin üzerine yerleştirecektir. Her takım kendi katmanını oluşturur. Ve bitmiş görüntü, bir araya getirilmiş katmanlardır.

Bilmeniz gereken önemli şey: Her Docker katmanı önbelleğe alınabilir. Son derlemeden bu yana hiçbir şey değişmediyse, docker komutu yürütmek yerine hazır bir katman alacaktır. Derleme hızındaki ana artış önbellek kullanımından kaynaklanacağından, derleme hızını ölçerken özellikle hazır önbellekle bir görüntü oluşturmaya dikkat edeceğiz. Yani adım adım:

  1. Önceki çalıştırmaların testi etkilememesi için görüntüleri yerel olarak sileriz.
    docker rmi $(docker images -q)
  2. Yapıyı ilk kez başlatıyoruz.
    time docker build -t app .
  3. Src/index.html dosyasını değiştiriyoruz - bir programcının çalışmasını taklit ediyoruz.
  4. Yapıyı ikinci kez çalıştırıyoruz.
    time docker build -t app .

Görüntü oluşturma ortamı doğru yapılandırılmışsa (bununla ilgili daha fazla bilgi aşağıda), derleme başladığında Docker'da zaten bir sürü önbellek bulunur. Görevimiz, yapının mümkün olduğu kadar çabuk ilerlemesi için önbelleğin nasıl kullanılacağını öğrenmek. Bir yapıyı önbellek olmadan çalıştırmanın yalnızca bir kez (ilk seferde) gerçekleştiğini varsaydığımız için, ilk seferin ne kadar yavaş olduğunu göz ardı edebiliriz. Testlerde, önbellekler zaten ısındığında ve pastamızı pişirmeye hazır olduğumuzda yapının ikinci çalışması bizim için önemlidir. Ancak bazı ipuçları ilk yapıyı da etkileyecektir.

Yukarıda anlattığımız Dockerfile’ı proje klasörüne atalım ve build’e başlayalım. Tüm listeler okuma kolaylığı için özetlenmiştir.

$ time docker build -t app .
Sending build context to Docker daemon 409MB
Step 1/5 : FROM node:12.16.2
Status: Downloaded newer image for node:12.16.2
Step 2/5 : WORKDIR /app
Step 3/5 : COPY . .
Step 4/5 : RUN npm ci
added 1357 packages in 22.47s
Step 5/5 : RUN npm run build --prod
Date: 2020-04-16T19:20:09.664Z - Hash: fffa0fddaa3425c55dd3 - Time: 37581ms
Successfully built c8c279335f46
Successfully tagged app:latest

real 5m4.541s
user 0m0.000s
sys 0m0.000s

Src/index.html dosyasının içeriğini değiştirip ikinci kez çalıştırıyoruz.

$ time docker build -t app .
Sending build context to Docker daemon 409MB
Step 1/5 : FROM node:12.16.2
Step 2/5 : WORKDIR /app
 ---> Using cache
Step 3/5 : COPY . .
Step 4/5 : RUN npm ci
added 1357 packages in 22.47s
Step 5/5 : RUN npm run build --prod
Date: 2020-04-16T19:26:26.587Z - Hash: fffa0fddaa3425c55dd3 - Time: 37902ms
Successfully built 79f335df92d3
Successfully tagged app:latest

real 3m33.262s
user 0m0.000s
sys 0m0.000s

Görüntünün elimizde olup olmadığını görmek için komutu çalıştırın docker images:

REPOSITORY   TAG      IMAGE ID       CREATED              SIZE
app          latest   79f335df92d3   About a minute ago   1.74GB

Docker, derlemeden önce mevcut bağlamdaki tüm dosyaları alır ve bunları kendi arka plan programına gönderir. Sending build context to Docker daemon 409MB. Derleme bağlamı, inşa komutunun son argümanı olarak belirtilir. Bizim durumumuzda bu geçerli dizindir - “.” ve Docker bu klasörde sahip olduğumuz her şeyi sürükler. 409 MB çok fazla: nasıl düzeltebileceğimizi düşünelim.

Bağlamı azaltmak

Bağlamı azaltmak için iki seçenek vardır. Veya montaj için gereken tüm dosyaları ayrı bir klasöre koyun ve docker içeriğini bu klasöre yönlendirin. Bu her zaman uygun olmayabilir, dolayısıyla istisnalar belirlemek mümkündür: nelerin bağlama sürüklenmemesi gerekir. Bunu yapmak için .dockerignore dosyasını projeye yerleştirin ve derleme için neyin gerekli olmadığını belirtin:

.git
/node_modules

ve yapıyı tekrar çalıştırın:

$ time docker build -t app .
Sending build context to Docker daemon 607.2kB
Step 1/5 : FROM node:12.16.2
Step 2/5 : WORKDIR /app
 ---> Using cache
Step 3/5 : COPY . .
Step 4/5 : RUN npm ci
added 1357 packages in 22.47s
Step 5/5 : RUN npm run build --prod
Date: 2020-04-16T19:33:54.338Z - Hash: fffa0fddaa3425c55dd3 - Time: 37313ms
Successfully built 4942f010792a
Successfully tagged app:latest

real 1m47.763s
user 0m0.000s
sys 0m0.000s

607.2 KB, 409 MB'tan çok daha iyidir. Ayrıca görsel boyutunu 1.74 GB'tan 1.38 GB'a düşürdük:

REPOSITORY   TAG      IMAGE ID       CREATED         SIZE
app          latest   4942f010792a   3 minutes ago   1.38GB

Görüntünün boyutunu daha da küçültmeye çalışalım.

Alp kullanıyoruz

Görüntü boyutundan tasarruf etmenin başka bir yolu da küçük bir ana görüntü kullanmaktır. Ebeveyn imajı, imajımızın hazırlandığı imajdır. Alt katman komutla belirtilir FROM Dockerfile'da. Bizim durumumuzda, halihazırda nodejs'in kurulu olduğu Ubuntu tabanlı bir imaj kullanıyoruz. Ve ağırlığı...

$ docker images -a | grep node
node 12.16.2 406aa3abbc6c 17 minutes ago 916MB

... neredeyse bir gigabayt. Alpine Linux tabanlı bir görüntü kullanarak ses düzeyini önemli ölçüde azaltabilirsiniz. Alpine çok küçük bir Linux'tur. Alpine tabanlı nodejs için docker görüntüsü yalnızca 88.5 MB ağırlığındadır. O halde evlerdeki canlı imajımızı değiştirelim:

FROM node:12.16.2-alpine3.11
RUN apk --no-cache --update --virtual build-dependencies add 
    python 
    make 
    g++
WORKDIR /app
COPY . .
RUN npm ci
RUN npm run build --prod

Uygulamayı oluşturmak için gerekli olan bazı şeyleri yüklememiz gerekiyordu. Evet, Angular Python olmadan oluşturulamaz ¯(°_o)/¯

Ancak görsel boyutu 150 MB'a düştü:

REPOSITORY   TAG      IMAGE ID       CREATED          SIZE
app          latest   aa031edc315a   22 minutes ago   761MB

Daha da ileri gidelim.

Çok aşamalı montaj

Görüntüdeki her şey üretimde ihtiyacımız olan şey değil.

$ docker run app ls -lah
total 576K
drwxr-xr-x 1 root root 4.0K Apr 16 19:54 .
drwxr-xr-x 1 root root 4.0K Apr 16 20:00 ..
-rwxr-xr-x 1 root root 19 Apr 17 2020 .dockerignore
-rwxr-xr-x 1 root root 246 Apr 17 2020 .editorconfig
-rwxr-xr-x 1 root root 631 Apr 17 2020 .gitignore
-rwxr-xr-x 1 root root 181 Apr 17 2020 Dockerfile
-rwxr-xr-x 1 root root 1020 Apr 17 2020 README.md
-rwxr-xr-x 1 root root 3.6K Apr 17 2020 angular.json
-rwxr-xr-x 1 root root 429 Apr 17 2020 browserslist
drwxr-xr-x 3 root root 4.0K Apr 16 19:54 dist
drwxr-xr-x 3 root root 4.0K Apr 17 2020 e2e
-rwxr-xr-x 1 root root 1015 Apr 17 2020 karma.conf.js
-rwxr-xr-x 1 root root 620 Apr 17 2020 ngsw-config.json
drwxr-xr-x 1 root root 4.0K Apr 16 19:54 node_modules
-rwxr-xr-x 1 root root 494.9K Apr 17 2020 package-lock.json
-rwxr-xr-x 1 root root 1.3K Apr 17 2020 package.json
drwxr-xr-x 5 root root 4.0K Apr 17 2020 src
-rwxr-xr-x 1 root root 210 Apr 17 2020 tsconfig.app.json
-rwxr-xr-x 1 root root 489 Apr 17 2020 tsconfig.json
-rwxr-xr-x 1 root root 270 Apr 17 2020 tsconfig.spec.json
-rwxr-xr-x 1 root root 1.9K Apr 17 2020 tslint.json

Ile docker run app ls -lah imajımızı temel alan bir kapsayıcı başlattık app ve içindeki komutu uyguladım ls -lah, ardından konteyner işini tamamladı.

Üretimde yalnızca bir klasöre ihtiyacımız var dist. Bu durumda dosyaların bir şekilde dışarıdan verilmesi gerekiyor. Nodejs üzerinde bazı HTTP sunucularını çalıştırabilirsiniz. Ama bunu kolaylaştıracağız. Dört harfi “y” olan Rusça bir kelimeyi tahmin edin. Sağ! Ynzhynyksy. Nginx ile bir resim alalım, içine bir klasör koyalım dist ve küçük bir yapılandırma:

server {
    listen 80 default_server;
    server_name localhost;
    charset utf-8;
    root /app/dist;

    location / {
        try_files $uri $uri/ /index.html;
    }
}

Çok aşamalı yapı tüm bunları yapmamıza yardımcı olacaktır. Docker dosyamızı değiştirelim:

FROM node:12.16.2-alpine3.11 as builder
RUN apk --no-cache --update --virtual build-dependencies add 
    python 
    make 
    g++
WORKDIR /app
COPY . .
RUN npm ci
RUN npm run build --prod

FROM nginx:1.17.10-alpine
RUN rm /etc/nginx/conf.d/default.conf
COPY nginx/static.conf /etc/nginx/conf.d
COPY --from=builder /app/dist/app .

Şimdi iki talimatımız var FROM Dockerfile'da her biri farklı bir derleme adımı çalıştırır. İlkini aradık builder, ancak son FROM'dan başlayarak son imajımız hazırlanacaktır. Son adım, önceki adımdaki montajımızın eserini nginx ile son görüntüye kopyalamaktır. Görüntünün boyutu önemli ölçüde azaldı:

REPOSITORY   TAG      IMAGE ID       CREATED          SIZE
app          latest   2c6c5da07802   29 minutes ago   36MB

Kabı imajımızla çalıştıralım ve her şeyin çalıştığından emin olalım:

docker run -p8080:80 app

-p8080:80 seçeneğini kullanarak, ana makinemizdeki 8080 numaralı bağlantı noktasını, nginx'in çalıştığı konteynerin içindeki 80 numaralı bağlantı noktasına ilettik. Tarayıcıda aç http://localhost:8080/ ve uygulamamızı görüyoruz. Her şey çalışıyor!

Docker görüntüleri oluşturmanın nasıl hızlandırılacağına ilişkin bazı ipuçları. Örneğin 30 saniyeye kadar

Görüntü boyutunun 1.74 GB'tan 36 MB'a düşürülmesi, uygulamanızın üretime sunulması için gereken süreyi önemli ölçüde azaltır. Ama hadi toplanma zamanına geri dönelim.

$ time docker build -t app .
Sending build context to Docker daemon 608.8kB
Step 1/11 : FROM node:12.16.2-alpine3.11 as builder
Step 2/11 : RUN apk --no-cache --update --virtual build-dependencies add python make g++
 ---> Using cache
Step 3/11 : WORKDIR /app
 ---> Using cache
Step 4/11 : COPY . .
Step 5/11 : RUN npm ci
added 1357 packages in 47.338s
Step 6/11 : RUN npm run build --prod
Date: 2020-04-16T21:16:03.899Z - Hash: fffa0fddaa3425c55dd3 - Time: 39948ms
 ---> 27f1479221e4
Step 7/11 : FROM nginx:stable-alpine
Step 8/11 : WORKDIR /app
 ---> Using cache
Step 9/11 : RUN rm /etc/nginx/conf.d/default.conf
 ---> Using cache
Step 10/11 : COPY nginx/static.conf /etc/nginx/conf.d
 ---> Using cache
Step 11/11 : COPY --from=builder /app/dist/app .
Successfully built d201471c91ad
Successfully tagged app:latest

real 2m17.700s
user 0m0.000s
sys 0m0.000s

Katmanların sırasını değiştirme

İlk üç adımımız önbelleğe alındı ​​(ipucu Using cache). Dördüncü adımda tüm proje dosyaları kopyalanır ve beşinci adımda bağımlılıklar kurulur RUN npm ci - 47.338'e kadar. Çok nadiren değişiyorlarsa neden bağımlılıkları her seferinde yeniden yükleyesiniz ki? Neden önbelleğe alınmadıklarını bulalım. Önemli olan, Docker'ın komutun ve onunla ilişkili dosyaların değişip değişmediğini görmek için katman katman kontrol etmesidir. Dördüncü adımda projemizin tüm dosyalarını kopyalıyoruz ve bunların arasında elbette değişiklikler var, yani Docker sadece bu katmanı önbellekten değil, aynı zamanda sonraki tüm dosyaları da alıyor! Docker dosyasında bazı küçük değişiklikler yapalım.

FROM node:12.16.2-alpine3.11 as builder
RUN apk --no-cache --update --virtual build-dependencies add 
    python 
    make 
    g++
WORKDIR /app
COPY package*.json ./
RUN npm ci
COPY . .
RUN npm run build --prod

FROM nginx:1.17.10-alpine
RUN rm /etc/nginx/conf.d/default.conf
COPY nginx/static.conf /etc/nginx/conf.d
COPY --from=builder /app/dist/app .

Önce package.json ve package-lock.json kopyalanır, ardından bağımlılıklar yüklenir ve ancak bundan sonra projenin tamamı kopyalanır. Sonuç olarak:

$ time docker build -t app .
Sending build context to Docker daemon 608.8kB
Step 1/12 : FROM node:12.16.2-alpine3.11 as builder
Step 2/12 : RUN apk --no-cache --update --virtual build-dependencies add python make g++
 ---> Using cache
Step 3/12 : WORKDIR /app
 ---> Using cache
Step 4/12 : COPY package*.json ./
 ---> Using cache
Step 5/12 : RUN npm ci
 ---> Using cache
Step 6/12 : COPY . .
Step 7/12 : RUN npm run build --prod
Date: 2020-04-16T21:29:44.770Z - Hash: fffa0fddaa3425c55dd3 - Time: 38287ms
 ---> 1b9448c73558
Step 8/12 : FROM nginx:stable-alpine
Step 9/12 : WORKDIR /app
 ---> Using cache
Step 10/12 : RUN rm /etc/nginx/conf.d/default.conf
 ---> Using cache
Step 11/12 : COPY nginx/static.conf /etc/nginx/conf.d
 ---> Using cache
Step 12/12 : COPY --from=builder /app/dist/app .
Successfully built a44dd7c217c3
Successfully tagged app:latest

real 0m46.497s
user 0m0.000s
sys 0m0.000s

46 dakika yerine 3 saniye - çok daha iyi! Katmanların doğru sırası önemlidir: önce değişmeyenleri, sonra nadiren değişenleri ve son olarak da sık sık değişenleri kopyalarız.

Sonra, görüntülerin CI/CD sistemlerinde birleştirilmesi hakkında birkaç söz.

Önbellek için önceki görüntüleri kullanma

Derleme için bir tür SaaS çözümü kullanırsak yerel Docker önbelleği temiz ve yeni olabilir. Liman işçisine pişmiş katmanları alabileceği bir yer vermek için ona önceden oluşturulmuş görüntüyü verin.

Uygulamamızı GitHub Actions'da oluşturmaya bir örnek verelim. Bu yapılandırmayı kullanıyoruz

on:
  push:
    branches:
      - master

name: Test docker build

jobs:
  deploy:
    name: Build
    runs-on: ubuntu-latest
    env:
      IMAGE_NAME: docker.pkg.github.com/${{ github.repository }}/app
      IMAGE_TAG: ${{ github.sha }}

    steps:
    - name: Checkout
      uses: actions/checkout@v2

    - name: Login to GitHub Packages
      env:
        TOKEN: ${{ secrets.GITHUB_TOKEN }}
      run: |
        docker login docker.pkg.github.com -u $GITHUB_ACTOR -p $TOKEN

    - name: Build
      run: |
        docker build 
          -t $IMAGE_NAME:$IMAGE_TAG 
          -t $IMAGE_NAME:latest 
          .

    - name: Push image to GitHub Packages
      run: |
        docker push $IMAGE_NAME:latest
        docker push $IMAGE_NAME:$IMAGE_TAG

    - name: Logout
      run: |
        docker logout docker.pkg.github.com

Görüntü iki dakika 20 saniyede birleştirilir ve GitHub Paketlerine gönderilir:

Docker görüntüleri oluşturmanın nasıl hızlandırılacağına ilişkin bazı ipuçları. Örneğin 30 saniyeye kadar

Şimdi yapıyı, önceki oluşturulmuş görüntülere dayalı olarak bir önbellek kullanılacak şekilde değiştirelim:

on:
  push:
    branches:
      - master

name: Test docker build

jobs:
  deploy:
    name: Build
    runs-on: ubuntu-latest
    env:
      IMAGE_NAME: docker.pkg.github.com/${{ github.repository }}/app
      IMAGE_TAG: ${{ github.sha }}

    steps:
    - name: Checkout
      uses: actions/checkout@v2

    - name: Login to GitHub Packages
      env:
        TOKEN: ${{ secrets.GITHUB_TOKEN }}
      run: |
        docker login docker.pkg.github.com -u $GITHUB_ACTOR -p $TOKEN

    - name: Pull latest images
      run: |
        docker pull $IMAGE_NAME:latest || true
        docker pull $IMAGE_NAME-builder-stage:latest || true

    - name: Images list
      run: |
        docker images

    - name: Build
      run: |
        docker build 
          --target builder 
          --cache-from $IMAGE_NAME-builder-stage:latest 
          -t $IMAGE_NAME-builder-stage 
          .
        docker build 
          --cache-from $IMAGE_NAME-builder-stage:latest 
          --cache-from $IMAGE_NAME:latest 
          -t $IMAGE_NAME:$IMAGE_TAG 
          -t $IMAGE_NAME:latest 
          .

    - name: Push image to GitHub Packages
      run: |
        docker push $IMAGE_NAME-builder-stage:latest
        docker push $IMAGE_NAME:latest
        docker push $IMAGE_NAME:$IMAGE_TAG

    - name: Logout
      run: |
        docker logout docker.pkg.github.com

Öncelikle size neden iki komutun başlatıldığını söylememiz gerekiyor. build. Gerçek şu ki, çok aşamalı bir montajda ortaya çıkan görüntü, son aşamadan gelen bir dizi katman olacaktır. Bu durumda önceki katmanların katmanları görüntüye dahil edilmeyecektir. Bu nedenle, önceki bir yapının son görüntüsünü kullanırken Docker, görüntüyü nodejs (oluşturucu aşaması) ile oluşturmak için hazır katmanlar bulamayacaktır. Bu sorunu çözmek için bir ara görüntü oluşturulur. $IMAGE_NAME-builder-stage ve sonraki bir yapıda önbellek kaynağı olarak kullanılabilmesi için GitHub Paketlerine iletilir.

Docker görüntüleri oluşturmanın nasıl hızlandırılacağına ilişkin bazı ipuçları. Örneğin 30 saniyeye kadar

Toplam montaj süresi bir buçuk dakikaya düşürüldü. Önceki görüntüleri çekmek için yarım dakika harcanır.

Ön görüntüleme

Temiz bir Docker önbelleği sorununu çözmenin başka bir yolu da katmanlardan bazılarını başka bir Docker dosyasına taşımak, onu ayrı olarak oluşturmak, Container Registry'ye göndermek ve onu bir üst öğe olarak kullanmaktır.

Angular uygulaması oluşturmak için kendi nodejs imajımızı oluşturuyoruz. Projede Dockerfile.node oluşturun

FROM node:12.16.2-alpine3.11
RUN apk --no-cache --update --virtual build-dependencies add 
    python 
    make 
    g++

Docker Hub'da herkese açık bir görsel topluyor ve aktarıyoruz:

docker build -t exsmund/node-for-angular -f Dockerfile.node .
docker push exsmund/node-for-angular:latest

Şimdi ana Docker dosyamızda bitmiş görüntüyü kullanıyoruz:

FROM exsmund/node-for-angular:latest as builder
...

Örneğimizde derleme süresi azalmadı ancak çok sayıda projeniz varsa ve bunların her birine aynı bağımlılıkları yüklemeniz gerekiyorsa önceden oluşturulmuş görüntüler yararlı olabilir.

Docker görüntüleri oluşturmanın nasıl hızlandırılacağına ilişkin bazı ipuçları. Örneğin 30 saniyeye kadar

Liman işçisi görüntülerinin oluşturulmasını hızlandırmak için çeşitli yöntemlere baktık. Dağıtımın hızlı bir şekilde ilerlemesini istiyorsanız projenizde bunu kullanmayı deneyin:

  • bağlamı azaltmak;
  • küçük ana görsellerin kullanımı;
  • çok aşamalı montaj;
  • önbelleğin verimli şekilde kullanılması için Dockerfile'daki talimatların sırasını değiştirmek;
  • CI/CD sistemlerinde önbellek oluşturma;
  • görüntülerin ön oluşturulması.

Bu örneğin Docker'ın nasıl çalıştığını daha net hale getireceğini ve dağıtımınızı en iyi şekilde yapılandırabileceğinizi umuyorum. Makaledeki örneklerle oynamak için bir depo oluşturuldu https://github.com/devopsprodigy/test-docker-build.

Kaynak: habr.com

Yorum ekle