¿Cuáles son las mejores prácticas para usar las instrucciones ADD y COPY en Docker?
sobes.tech AI
Respuesta de la IA
Existen varias mejores prácticas para las instrucciones ADD y COPY en Docker, destinadas a mejorar la seguridad, transparencia y eficiencia en la construcción de imágenes.
La principal diferencia entre ADD y COPY:
COPYsimplemente copia archivos y directorios desde la fuente especificada en el host a la ubicación destino en el contenedor. La fuente debe ser un archivo o directorio local.ADDtiene capacidades más amplias: puede copiar archivos y directorios locales, así como extraer archivos comprimidos (tar, gzip, bzip2) y obtener archivos desde URLs.
Mejores prácticas:
-
Prefiera
COPYen lugar deADD: En la mayoría de los casos,COPYes suficiente. Es más transparente, ya que simplemente copia archivos locales. UsarADDpara extraer archivos o descargar desde URLs puede ser menos predecible y aumentar la complejidad de la construcción. -
Use
COPYpara archivos locales: Si necesita copiar archivos desde el contexto de construcción a la imagen, siempre useCOPY.# En lugar de ADD . /app COPY . /app -
Tenga cuidado con URLs en
ADD: UsarADDcon URL puede llevar a inestabilidad en la construcción si el recurso remoto no está disponible. Además, puede ser menos seguro, ya que depende de una fuente externa. Es preferible usarcurlowgeten una capa separada (RUN) para descargar recursos desde URLs, lo que da más control y permite verificar sumas de comprobación.# En lugar de 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 -
Extraiga archivos en una capa separada al usar
ADD: Si debe usarADDpara extraer un archivo (escenario menos común), asegúrese de hacerlo en una capa separada. Sin embargo, como se mencionó anteriormente, generalmente es mejor realizar la extracción de manera explícita conRUN. -
Copie solo los archivos necesarios: No copie todo el contexto de construcción (
COPY . /app) si contiene archivos innecesarios (código fuente, datos de prueba, directorios ocultos, etc.). Use.dockerignorepara excluir estos archivos. Esto reduce el tamaño de la imagen y acelera la construcción al disminuir la cantidad de datos transferidos al demonio de Docker.Ejemplo de
.dockerignore:.git node_modules *.log tmp/# Copie solo los archivos necesarios después de aplicar `.dockerignore` COPY . /app -
Use rutas absolutas para destinos: Siempre indique rutas absolutas en la imagen (/app, /usr/local/bin, etc.). Esto hace que el Dockerfile sea más comprensible y predecible, evitando incertidumbres respecto al directorio de trabajo actual (
WORKDIR).# Siempre indique rutas absolutas COPY src /app/src -
Varíe el orden según la frecuencia de cambios: Coloque las instrucciones
COPYoADDpara archivos que cambian menos frecuentemente (por ejemplo, archivos de dependencias comopackage.json,requirements.txt) arriba en el Dockerfile, y las instrucciones para archivos que cambian más frecuentemente (código fuente de la aplicación) abajo. Esto permite que Docker aproveche eficientemente la caché de capas.# Archivos de dependencias (cambian menos) COPY requirements.txt /app/ RUN pip install --no-cache-dir -r requirements.txt # Código fuente de la aplicación (cambia más) COPY . /app/
Tabla resumen:
| Instrucción | Descripción | Uso recomendado | Lo que se debe evitar |
|---|---|---|---|
COPY |
Copia archivos/directorios locales | Copiar archivos y directorios locales en la imagen. | Usar si se necesita extraer archivos o descargar desde URL. |
ADD |
Copia archivos/directorios locales, extrae archivos, descarga desde URL | Uso para extracción automática de archivos (poco frecuente). | Usar para copiar archivos locales (prefiera COPY). Usar para descarga desde URL. |
Seguir estas prácticas conduce a la creación de imágenes Docker más confiables, seguras y eficientes.