Sobes.tech
Middle

¿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:

  • COPY simplemente 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.
  • ADD tiene 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:

  1. Prefiera COPY en lugar de ADD: En la mayoría de los casos, COPY es suficiente. Es más transparente, ya que simplemente copia archivos locales. Usar ADD para extraer archivos o descargar desde URLs puede ser menos predecible y aumentar la complejidad de la construcción.

  2. Use COPY para archivos locales: Si necesita copiar archivos desde el contexto de construcción a la imagen, siempre use COPY.

    # En lugar de ADD . /app
    COPY . /app 
    
  3. Tenga cuidado con URLs en ADD: Usar ADD con 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 usar curl o wget en 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
    
  4. Extraiga archivos en una capa separada al usar ADD: Si debe usar ADD para 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 con RUN.

  5. 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 .dockerignore para 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
    
  6. 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
    
  7. Varíe el orden según la frecuencia de cambios: Coloque las instrucciones COPY o ADD para archivos que cambian menos frecuentemente (por ejemplo, archivos de dependencias como package.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.