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
COPY <origen> <destino>Ejemplos Prácticos
1. Copiar un archivo individual
# Copiar un archivo específico
COPY app.py /app/
# Copiar con ruta absoluta
COPY requirements.txt /usr/src/app/2. Copiar múltiples archivos
# 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
# Copiar un directorio completo
COPY src/ /app/src/
# Copiar directorio manteniendo la estructura
COPY static/ /var/www/static/4. Copiar con permisos específicos
# 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
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
# 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:
.git
.gitignore
README.md
Dockerfile
.dockerignore
node_modules
*.log
.env3. COPY vs ADD
Prefiere COPY sobre ADD a menos que necesites funcionalidades específicas:
# 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
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 8080Comandos Útiles para Probar
# 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-appConsideraciones Importantes
Rutas relativas: Se resuelven desde el contexto de build
Destino debe existir: Si no existe, se crea automáticamente
Permisos: Por defecto mantiene permisos del archivo original
Wildcards: Funcionan pero con comportamiento específico
El comando COPY es esencial para construir imágenes Docker eficientes y organizadas. ¡Úsalo sabiamente!
Comentarios
Publicar un comentario