Tutorial: Docker COPY

 


El comando COPY en Docker es fundamental para copiar archivos y directorios desde tu máquina local al sistema de archivos de la imagen Docker durante el proceso de build.

Sintaxis Básica

dockerfile
COPY <origen> <destino>

Ejemplos Prácticos

1. Copiar un archivo individual

dockerfile
# Copiar un archivo específico
COPY app.py /app/

# Copiar con ruta absoluta
COPY requirements.txt /usr/src/app/

2. Copiar múltiples archivos

dockerfile
# Copiar varios archivos específicos
COPY file1.txt file2.py /app/

# Usar patrones (wildcards)
COPY *.txt /app/documents/
COPY *.py *.js /app/scripts/

3. Copiar directorios completos

dockerfile
# Copiar un directorio completo
COPY src/ /app/src/

# Copiar directorio manteniendo la estructura
COPY static/ /var/www/static/

4. Copiar con permisos específicos

dockerfile
# Cambiar propietario durante la copia
COPY --chown=usuario:grupo archivo.conf /etc/app/

# Cambiar permisos
COPY --chmod=755 script.sh /usr/local/bin/

Ejemplo Completo de Dockerfile

dockerfile
FROM python:3.9-slim

# Crear directorio de trabajo
WORKDIR /app

# Copiar requirements primero (para aprovechar cache de Docker)
COPY requirements.txt .

# Instalar dependencias
RUN pip install -r requirements.txt

# Copiar el resto de la aplicación
COPY . .

# Copiar archivos de configuración
COPY config/ /app/config/
COPY --chmod=755 scripts/start.sh /app/

# Exponer puerto
EXPOSE 8000

# Comando de inicio
CMD ["python", "app.py"]

Mejores Prácticas

1. Orden inteligente de COPY

dockerfile
# MAL - Cambios en el código invalidan la cache de dependencias
COPY . .
RUN pip install -r requirements.txt

# BIEN - Dependencias primero para mejor uso de cache
COPY requirements.txt .
RUN pip install -r requirements.txt
COPY . .

2. Usar .dockerignore

Crea un archivo .dockerignore para excluir archivos innecesarios:

text
.git
.gitignore
README.md
Dockerfile
.dockerignore
node_modules
*.log
.env

3. COPY vs ADD

Prefiere COPY sobre ADD a menos que necesites funcionalidades específicas:

dockerfile
# COPY - Recomendado para la mayoría de casos
COPY package.json .

# ADD - Solo cuando necesites extraer archives o descargar URLs
ADD https://example.com/file.tar.gz /tmp/
ADD archive.tar.gz /app/

Ejemplo Avanzado

dockerfile
FROM nginx:alpine

# Crear usuario no-root
RUN addgroup -g 1001 -S appgroup && \
    adduser -S appuser -u 1001 -G appgroup

# Copiar configuración nginx
COPY nginx.conf /etc/nginx/nginx.conf

# Copiar archivos estáticos con usuario específico
COPY --chown=appuser:appgroup static/ /usr/share/nginx/html/

# Copiar certificados SSL
COPY ssl/ /etc/nginx/ssl/

# Cambiar a usuario no-root
USER appuser

EXPOSE 8080

Comandos Útiles para Probar

bash
# Build de la imagen
docker build -t mi-app .

# Verificar lo que se copió
docker run -it mi-app ls -la /app

# Debug: ver layers de la imagen
docker history mi-app

Consideraciones Importantes

  1. Rutas relativas: Se resuelven desde el contexto de build

  2. Destino debe existir: Si no existe, se crea automáticamente

  3. Permisos: Por defecto mantiene permisos del archivo original

  4. Wildcards: Funcionan pero con comportamiento específico

El comando COPY es esencial para construir imágenes Docker eficientes y organizadas. ¡Úsalo sabiamente!

Comentarios

Entradas más populares de este blog

ejercicios-Crear Carpeta y Archivo de Texto en Ubuntu

Instalar Docker en Ubuntu Server usando docker.io

Tutorial de Carpetas y Directorios en Ubuntu Linux