Sobes.tech
Middle

Milyen legjobb gyakorlatok vannak az ADD és COPY utasítások Docker-ben való használatához?

sobes.tech MI

Válasz az MI-től

A Docker ADD és COPY parancsokra vonatkozóan több legjobb gyakorlat létezik, amelyek a biztonság, átláthatóság és hatékonyság növelését célozzák a képek építése során.

A ADD és COPY közötti fő különbség:

  • A COPY egyszerűen másolja a fájlokat és könyvtárakat a megadott forrásból a konténerben megadott helyre. A forrásnak helyi fájlnak vagy könyvtárnak kell lennie.
  • Az ADD szélesebb lehetőségekkel rendelkezik: másolhat helyi fájlokat és könyvtárakat, valamint kicsomagolhat archívumokat (tar, gzip, bzip2) és letölthet fájlokat URL-ről.

Legjobb gyakorlatok:

  1. Előnyben részesítse a COPY használatát ADD helyett: A legtöbb esetben elegendő a COPY. Átláthatóbb, mivel egyszerűen másolja a helyi fájlokat. Az ADD használata archívumok kicsomagolására vagy URL-ről való letöltésre kevésbé kiszámítható és bonyolultabbá teheti a buildet.

  2. Használja a COPY-t helyi fájlokhoz: Ha fájlokat kell másolni a build kontextusból a képre, mindig használja a COPY-t.

    # `ADD` helyett . /app
    COPY . /app 
    
  3. Legyen óvatos az URL-ekkel az ADD-ben: Az ADD URL-lel való használata instabilitáshoz vezethet, ha a távoli erőforrás nem elérhető. Emellett kevésbé biztonságos lehet, mivel külső forrásra támaszkodik. Ajánlott külön rétegben (RUN) curl vagy wget használata az erőforrások letöltéséhez URL-ről, ami nagyobb kontrollt és ellenőrzést tesz lehetővé, például ellenőrző összeg ellenőrzésével.

    # `ADD` helyett http://example.com/file.tar.gz /tmp/ használata
    RUN apt-get update && apt-get install -y curl && rm -rf /var/lib/apt/lists/* \
        && curl -fsSL http://example.com/file.tar.gz -o /tmp/file.tar.gz \
        && tar -xzf /tmp/file.tar.gz -C /app \
        && rm /tmp/file.tar.gz
    
  4. Archiválás kicsomagolása külön rétegben ADD használatakor: Ha kell az ADD-t használni archívum kicsomagolására (kevésbé gyakori szcenárió), győződjön meg róla, hogy ezt külön rétegben végzi. Azonban, ahogy korábban említettük, gyakran jobb explicit módon RUN-nel kicsomagolni.

  5. Csak a szükséges fájlokat másolja: Ne másolja az egész build kontextust (COPY . /app), ha vannak benne szükségtelen fájlok (forráskód, tesztadatok, rejtett könyvtárak stb.). Használja a .dockerignore-t ezek kizárására. Ez csökkenti az image méretét és gyorsítja a buildet, mivel kevesebb adatot küld a Docker démonnak.

    .dockerignore példa:

    .git
    node_modules
    *.log
    tmp/
    
    # Csak a szükséges fájlokat másolja a `.dockerignore` alkalmazása után
    COPY . /app
    
  6. Használjon abszolút útvonalakat a célhoz: Mindig adjon meg abszolút útvonalat a képen (/app, /usr/local/bin stb.). Ez érthetőbbé és kiszámíthatóbbá teszi a Dockerfile-t, elkerülve a jelenlegi munkakönyvtár (WORKDIR) bizonytalanságát.

    # Mindig adjon meg abszolút célútvonalat
    COPY src /app/src
    
  7. Változtassa a sorrendet a változások gyakorisága szerint: Helyezze el a COPY vagy ADD utasításokat azokhoz a fájlokhoz, amelyek ritkábban változnak (pl. függőségi fájlok, mint a package.json, requirements.txt), a Dockerfile tetején, míg azokhoz a fájlokhoz, amelyek gyakrabban változnak (pl. alkalmazás forráskódja), alul. Ez lehetővé teszi a Docker számára, hogy hatékonyan használja a cache-t.

    # Ritkábban változó függőségi fájlok
    COPY requirements.txt /app/
    RUN pip install --no-cache-dir -r requirements.txt
    
    # Gyakrabban változó alkalmazás forráskód
    COPY . /app/ 
    

Összefoglaló táblázat:

Utasítás Leírás Ajánlott használat Kerülendő
COPY Helyi fájlokat/könyvtárakat másol Helyi fájlok és könyvtárak másolása a képre Ne használja, ha archívumokat kell kicsomagolni vagy URL-ről tölteni
ADD Helyi fájlokat/könyvtárakat másol, archívumokat kicsomagol, URL-ről tölt Automatikus archívum kicsomagolására (ritkán) Ne használja helyi fájlok másolására (COPY előnyösebb). URL-ről való töltésre

Ezeknek a gyakorlatoknak a betartásával megbízhatóbb, biztonságosabb és hatékonyabb Docker képeket hozhat létre.