Dockerfile: FROM și WORKDIR în Docker

Dockerfile Docker 1.0+

Alege imaginea de bază a construcției și setează directorul curent de lucru în imagine.

Sintaxă comandă
FROM [--platform=...] imagine[:etichetă|@digest] [AS nume_etapă]
WORKDIR /cale/în/container

Ce face Dockerfile: FROM și WORKDIR

Orice Dockerfile începe cu instrucțiunea FROM (singura excepție este ARG declarată înainte de FROM, folosită pentru a parametriza versiunea imaginii de bază). FROM stabilește sistemul de fișiere și uneltele de la care pornești: de exemplu python:3.12-slim, node:20-alpine sau chiar scratch (o imagine complet goală, pentru binare compilate static în Go sau Rust).

Alegerea variantei contează mult pentru dimensiune și securitate: imaginile -alpine (bazate pe Alpine Linux și biblioteca musl) au 5–50 MB, iar cele -slim (Debian minimal, cu glibc) au 50–150 MB și evită incompatibilitățile rare ale pachetelor native cu musl.

Instrucțiunea WORKDIR schimbă directorul curent pentru toate instrucțiunile următoare (RUN, COPY, ADD, CMD, ENTRYPOINT) și îl creează automat dacă nu există. Folosește întotdeauna WORKDIR în loc de RUN mkdir -p /app && cd /app, deoarece cd într-un RUN nu se păstrează în stratul următor.

Opțiuni și argumente

Opțiune / Parametru Descriere
FROM imagine:etichetă Imaginea de bază; fixează întotdeauna o versiune (nu lăsa latest implicit).
FROM ... AS nume Dă un nume etapei curente, astfel încât să poți copia artefacte din ea într-un build multi-stage (COPY --from=nume).
FROM scratch Imagine specială, complet goală (0 octeți), pentru executabile statice care nu au nevoie de shell sau libc.
WORKDIR /cale Setează directorul curent; dacă este relativă, se raportează la WORKDIR-ul anterior.

Exemple

Exemplul 1: Începutul tipic al unui Dockerfile cu versiune parametrizabilă

Un ARG plasat înainte de FROM poate fi folosit în eticheta imaginii de bază.

ARG NODE_VERSION=20-alpine
FROM node:${NODE_VERSION}

WORKDIR /app
COPY package*.json ./

Greșeli frecvente

  • Scrierea RUN cd /app într-un strat și presupunerea că instrucțiunea RUN următoare va rula tot în /app: fiecare RUN pornește un shell nou în directorul WORKDIR.
  • Folosirea FROM ubuntu sau FROM node fără etichetă: peste câteva luni un docker build --no-cache poate trage o versiune majoră nouă care rupe aplicația.

Comenzi înrudite

  • docker build: Construiește o imagine pe baza unui Dockerfile și a unui context de build.
  • Dockerfile: Multi-stage builds: Construiește aplicația într-o etapă cu compilatoare și copiază doar rezultatul într-o imagine finală mică.
  • Dockerfile: COPY și ADD: Copiază fișiere și directoare din contextul de build (sau din altă etapă) în imagine.
  • Dockerfile: RUN: Execută comenzi în timpul construirii imaginii și salvează rezultatul într-un strat nou.