Sobes.tech
Junior

Minden parancs a Dockerfile-ban rétegeket hoz létre?

sobes.tech MI

Válasz az MI-től

Igen. Minden utasítás a Dockerfile-ban új réteget hoz létre az image-ben, kivéve például az ARG, LABEL, ENV. Ezek az utasítások csak metaadatokat vagy környezeti változókat adnak hozzá, anélkül, hogy befolyásolnák a réteg fájlrendszerének tartalmát.

Fontos utasítások, amelyek rétegeket hoznak létre:

  • FROM: Alap kép, amelyből az építkezés indul.
  • RUN: Parancsok végrehajtása a konténerben. Minden RUN utasítás egy külön réteg. A parancsok egyesítésével egy RUN-ban a && segítségével csökkenthető a rétegek száma.
  • COPY: Fájlok és könyvtárak másolása a gazdagépről a konténerbe.
  • ADD: Hasonló a COPY-hoz, de képes archívumokat kicsomagolni és fájlokat letölteni URL-ről.
  • WORKDIR: A munkakönyvtár módosítása a következő utasításokhoz.
  • VOLUME: Csatolópont létrehozása.

Példa a rétegek bemutatására a build során:

FROM ubuntu:latest

RUN apt-get update && apt-get install -y nginx

COPY index.html /var/www/html/

WORKDIR /app

CMD ["nginx", "-g", "daemon off;"]

A Dockerfile építése során minden FROM, RUN, COPY, WORKDIR, CMD (bár a CMD és az ENTRYPOINT technikailag nem hoznak létre réteget a fájlrendszerben, de konfigurációs réteget hoznak létre) saját réteget képez, amit a Docker cache-el. A különböző típusú utasítások és hatásuk a rétegekre:

Utasítás Létrehoz-e réteget a fájlrendszerben? Hatás
FROM Igen Alap kép
RUN Igen Parancsok végrehajtása
COPY Igen Fájlok másolása
ADD Igen Fájlok másolása (kiegészítő funkciókkal)
WORKDIR Igen Könyvtár módosítása
ENV Nem Környezeti változók beállítása
ARG Nem Építési argumentumok meghatározása
LABEL Nem Metaadatok hozzáadása
VOLUME Igen Csatolópontok meghatározása
USER Igen Felhasználó kiválasztása
EXPOSE Nem Portok deklarálása
ENTRYPOINT Nem Futtatható fájl konfigurálása
CMD Nem Parancs konfigurálása a konténerhez

Kevesebb réteg könnyebb képeket és gyorsabb buildet eredményez, jobb cache-elés és kisebb képméret mellett. A Dockerfile optimalizálása gyakran a RUN utasítások számának minimalizálására és a parancsok sorrendjének megtervezésére összpontosít, hogy a cache-t maximálisan kihasználja.