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
COPYegyszerű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
ADDszé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:
-
Előnyben részesítse a
COPYhasználatátADDhelyett: A legtöbb esetben elegendő aCOPY. Átláthatóbb, mivel egyszerűen másolja a helyi fájlokat. AzADDhasználata archívumok kicsomagolására vagy URL-ről való letöltésre kevésbé kiszámítható és bonyolultabbá teheti a buildet. -
Használja a
COPY-t helyi fájlokhoz: Ha fájlokat kell másolni a build kontextusból a képre, mindig használja aCOPY-t.# `ADD` helyett . /app COPY . /app -
Legyen óvatos az URL-ekkel az
ADD-ben: AzADDURL-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)curlvagywgethaszná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 -
Archiválás kicsomagolása külön rétegben
ADDhasználatakor: Ha kell azADD-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ódonRUN-nel kicsomagolni. -
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..dockerignorepélda:.git node_modules *.log tmp/# Csak a szükséges fájlokat másolja a `.dockerignore` alkalmazása után COPY . /app -
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 -
Változtassa a sorrendet a változások gyakorisága szerint: Helyezze el a
COPYvagyADDutasításokat azokhoz a fájlokhoz, amelyek ritkábban változnak (pl. függőségi fájlok, mint apackage.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.