Sobes.tech
Middle

Mik a DevOps-ban az image-ek (képek) optimalizálásának fő módszerei?

sobes.tech MI

Válasz az MI-től

A konténerképek optimalizálása fontos a gyorsabb telepítés, az erőforrás-felhasználás csökkentése és a támadási felület minimalizálása érdekében. Fő módszerek:

  • Többlépcsős építés (Multi-stage builds): Több FROM utasítás használata a Dockerfile-ban. Közbenső szakaszokban artefaktokat (fordított kód, könyvtárak) hozunk létre, amelyeket később a végső, minimális képbe másolunk. Ez lehetővé teszi, hogy a build eszközök és függőségek, amelyek csak fordítási szakaszban szükségesek, ne kerüljenek a végső képbe.

    // 1. szakasz: Build szakasz
    FROM golang:1.20 as builder
    WORKDIR /app
    COPY . .
    RUN go build -o myapp
    
    // 2. szakasz: Végső szakasz
    FROM alpine:latest
    RUN apk --no-cache add ca-certificates
    COPY --from=builder /app/myapp /usr/local/bin/
    CMD ["myapp"]
    
  • Könnyű alapképek használata: Olyan könnyű alapképek kiválasztása, mint az Alpine, scratch vagy olyan disztribúciók, amelyek nem tartalmaznak előre telepített eszközöket és könyvtárakat, hogy minimalizálják a méretet és a potenciális sebezhetőségeket.

  • Felesleges fájlok kizárása: A .dockerignore fájl használata a nem szükséges fájlok (pl. tesztforráskód, verziókezelő rendszer fájljai, ideiglenes fájlok) képbe való másolásának megakadályozására.

  • Rétegek gyorsítótárazása: A Docker cache-eli az egyes rétegeket. Érdemes ritkán változó utasításokat a Dockerfile elejére helyezni. Gyakran változó utasításokat (pl. alkalmazáskód másolása) későbbre kell tenni.

    FROM ubuntu:latest
    
    // Ritkán változó utasítások
    RUN apt-get update && apt-get install -y --no-install-recommends \
        nginx \
        supervisor \
        && rm -rf /var/lib/apt/lists/*
    
    // Gyakran változó utasítások (pl. kód másolása)
    COPY myapp /app
    WORKDIR /app
    
  • RUN utasítások összefűzése: A rétegek számának minimalizálása több parancs egyetlen RUN utasításba való összefűzésével && használatával.

    // Nem optimális
    RUN apt-get update
    RUN apt-get install -y mylib1
    RUN apt-get install -y mylib2
    
    // Optimális
    RUN apt-get update && apt-get install -y --no-install-recommends mylib1 mylib2 && rm -rf /var/lib/apt/lists/*
    
  • Ideiglenes fájlok törlése: A csomagkezelők cache-ének törlése és ideiglenes fájlok eltávolítása az installálás után egy RUN utasításban.

  • Sorrend optimalizálása: A COPY vagy ADD parancsokat azokhoz a fájlokhoz helyezze, amelyek gyakran változnak, közelebb a Dockerfile végéhez, hogy a korábbi rétegek cache-ét maximálisan kihasználja.

  • Sebezhetőségek ellenőrzése: Eszközök, mint a Trivy, Clair vagy Anchore használata a kép sebezhetőségeinek feltárására.

  • Képek aláírása: A Notary vagy Cosign használata az integritás és hitelesség biztosítására.

  • Kép méretének csökkentésére szolgáló eszközök használata: Például DockerSlim vagy Dive az összetevők elemzéséhez és optimalizálásához.

Ezek a módszerek együtt alkalmazva jelentősen csökkenthetik a képek méretét, növelhetik a biztonságot és felgyorsíthatják a CI/CD folyamatot.