Ce face Dockerfile: COPY și ADD
Atât COPY, cât și ADD copiază fișiere din contextul de build în sistemul de fișiere al imaginii, însă buna practică este să folosești aproape întotdeauna COPY. COPY este previzibil: face doar copiere de fișiere locale (sau dintr-o altă etapă/imagine cu --from).
ADD are două comportamente „magice” suplimentare: dacă sursa este o arhivă locală comprimată (.tar.gz, .tar.xz, .tar.bz2), o dezarhivează automat în destinație; de asemenea acceptă un URL ca sursă. Dezarhivarea automată a unei arhive locale este singurul motiv real să folosești ADD.
Ordinea instrucțiunilor COPY este esențială pentru cache-ul de straturi: copiază mai întâi fișierele de dependențe (package.json, composer.json, requirements.txt), rulează instalarea și abia apoi copiază restul codului sursă. Astfel, la fiecare modificare de cod, Docker refolosește stratul cu dependențele deja instalate.
Opțiuni și argumente
| Opțiune / Parametru | Descriere |
|---|---|
sursă... destinație |
Căi relative la contextul de build; dacă destinația este un director, termin-o cu / (de ex. ./). |
--from=nume|imagine |
Pentru COPY: copiază dintr-o etapă anterioară (multi-stage) sau direct dintr-o imagine externă (de ex. --from=composer:2). |
--chown=user:grup |
Setează direct proprietarul fișierelor copiate, fără a dubla dimensiunea stratului cu un RUN chown ulterior. |
--chmod=755 |
Setează permisiunile fișierelor la copiere (BuildKit). |
--link |
Creează un strat independent care poate fi refolosit în cache chiar dacă straturile anterioare se schimbă (BuildKit). |
Exemple
Exemplul 1: Optimizarea cache-ului: dependențele înaintea codului
Stratul RUN npm ci se reconstruiește doar când se schimbă package.json sau package-lock.json.
FROM node:20-alpine
WORKDIR /app
COPY package.json package-lock.json ./
RUN npm ci --omit=dev
COPY --chown=node:node src/ ./src/
USER node
CMD ["node", "src/index.js"]
Greșeli frecvente
- Punerea
COPY . .înainte deRUN npm install/pip install: orice literă schimbată în cod invalidează cache-ul și reinstalează toate pachetele de la zero. - Copierea unui director cu
COPY dir /appcrezând că va crea/app/dir: Docker copiază conținutul luidirdirect în/app. - Încercarea de a copia un fișier din afara contextului:
COPY ../config.json .este respins din motive de securitate.
Comenzi înrudite
docker build: Construiește o imagine pe baza unui Dockerfile și a unui context de build..dockerignore: Exclude fișiere și directoare din contextul trimis la docker build, accelerând construcția și protejând secretele.Dockerfile: Multi-stage builds: Construiește aplicația într-o etapă cu compilatoare și copiază doar rezultatul într-o imagine finală mică.Dockerfile: FROM și WORKDIR: Alege imaginea de bază a construcției și setează directorul curent de lucru în imagine.