Koje su najbolje prakse za korišćenje instrukcija ADD i COPY u Docker-u?
sobes.tech АИ
Одговор од АИ
Постоји неколико најбољих пракси за команду ADD и COPY у Docker-у, које су усмерене на побољшање безбедности, транспарентности и ефикасности у изградњи слика.
Главна разлика између ADD и COPY:
COPYједноставно копира датотеке и директоријуме из наведеног извора на хосту у одређено место у контејнеру. Извор мора бити локална датотека или директоријум.ADDима шире могућности: може копирати локалне датотеке и директоријуме, као и распакујати архиве (tar, gzip, bzip2) и преузимати датотеке преко URL-а.
Најбоље праксе:
-
Преоритирајте
COPYу односу наADD: У већини случајева,COPYје довољан. Је транспарентнији, јер једноставно копира локалне датотеке. КоришћењеADDза распакуј архива или преузимање преко URL-а може бити мање предвидиво и повећати сложеност изградње. -
Користите
COPYза локалне датотеке: Ако вам треба да копирате датотеке из контекста изградње у слику, увек користитеCOPY.# Уместо `ADD` . /app COPY . /app -
Будите опрезни са URL-овима у
ADD: КоришћењеADDса URL-ом може довести до нестабилности изградње ако је удаљени ресурс недоступан. Такође, то може бити мање безбедно, јер зависите од спољашњег извора. Препоручује се да користитеcurlилиwgetу посебном слоју (RUN) за преузимање ресурса преко URL-а, што пружа већу контролу и могућност провере контролних сума.# Уместо `ADD http://example.com/file.tar.gz /tmp/` 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 -
Распакујте архиве у посебном слоју када користите
ADD: Ако морате да користитеADDза распакуј архив (мање уобичајени сценарио), уверите се да то радите у посебном слоју. Међутим, као што је раније поменуто, чешће је боље јасно распакујти помоћуRUN. -
Копирајте само неопходне датотеке: Не копирајте цео контекст изградње (
COPY . /app) ако у њему постоје непотребне датотеке (изворни код, тест подаци, скривени директорији итд.). Користите.dockerignoreда искључите те датотеке. Ово смањује величину слике и убрзава изградњу смањењем количине података који се преносе на Docker демон.Пример
.dockerignore:.git node_modules *.log tmp/# Копирајте само неопходне датотеке након примене `.dockerignore` COPY . /app -
Користите апсолутне путеве за одредиште: Увек наведите апсолутни пут за одредиште у слици (/app, /usr/local/bin итд.). Ово чини Dockerfile јаснијим и предвидљивијим, избегавајући неизвесност у вези са тренутним радним директоријумом (
WORKDIR).# Увек наведите апсолутни пут за одредиште COPY src /app/src -
Варирајте редослед у зависности од учесталости промена: Положите инструкције
COPYилиADDза датотеке које се мање често мењају (нпр. датотеке зависности каоpackage.json,requirements.txt) више у Dockerfile-у, а оне које се чешће мењају (нпр. изворни код апликације) ниже. Ово омогућава Docker-у да ефикасније користи кеш слојева.# Фајлови зависности (мање се мењају) COPY requirements.txt /app/ RUN pip install --no-cache-dir -r requirements.txt # Изворни код апликације (чешће се мења) COPY . /app/
Резиме табеле:
| Инструкција | Опис | Препоручена употреба | Чему треба избегавати |
|---|---|---|---|
COPY |
Копира локалне датотеке/директоријуме | Копирање локалних датотека и директоријума у слику | Не користите ако је потребно распакивање архива или преузимање преко URL-а |
ADD |
Копира локалне датотеке/директоријуме, распакује архиве, преузима преко URL-а | Коришћење за аутоматско распакивање архива (ретко) | Не користите за копирање локалних датотека (COPY је бољи). За преузимање преко URL-а користите ADD. |
Поштовање ових пракси доводи до стварања поузданијих, безбеднијих и ефикаснијих Docker слика.