Diferencia entre copiar y agregar comandos en Dockerfile
Un Dockerfile es un documento de texto que contiene todos los comandos utilizados para crear una imagen de Docker. Hemos visto una amplia adopción de Docker como la herramienta predeterminada para administrar configuraciones y automatizar implementaciones en el pasado reciente.
Las características avanzadas del uso de Dockerfiles, como las compilaciones automáticas, son la razón por la que los desarrolladores están adoptando Docker. Otros incluyen aislar las aplicaciones de los entornos que ejecutan y la seguridad rápidamente.
Al crear contenedores de Docker, a menudo es necesario transferir archivos desde el host a la imagen de Docker. Estos archivos pueden incluir bibliotecas o archivos de propiedades necesarios para que se ejecute su aplicación.
Diferencia entre los comandos COPIAR
y AÑADIR
en Dockerfile
En el Dockerfile, podemos copiar estos archivos usando el comando COPIAR
o AÑADIR
. Estos comandos son funcionalmente los mismos; sin embargo, existen algunas diferencias.
Los comandos COPIAR
y AÑADIR
siguen la siguiente sintaxis.
COPY <src> <dest>
ADD <src> <dest>
Ambas instrucciones copian archivos o directorios ubicados en <src>
en el host local y los agregan a la ubicación <dest>
en el sistema de archivos del contenedor. Por ejemplo, en el Dockerfile a continuación, copiamos archivos del directorio actual al directorio /var/www
en las imágenes de Docker.
# base image
FROM python
# Set your working directory
WORKDIR /var/www/
# Copy the necessary files
COPY ./app.py /var/www/app.py
ADD./requirements.txt /var/www/requirements.txt
# Install the necessary packages
RUN pip install -r /var/www/requirements.txt
ADD mkdir -p /var/www/new_directory
# Run the app
CMD ["echo", "Hello, Developer"]
Queremos copiar los archivos app.py
y requirements.txt
. Ahora, si construimos esta imagen de Docker y la usamos para crear un contenedor de Docker, sin duda podremos ubicar los dos archivos en el sistema de archivos del contenedor de Docker.
El siguiente ejemplo creará una imagen Docker basada en el Dockerfile anterior.
~/my-app$ Docker build -t new-image .
Una vez que tengamos una imagen, crearemos un contenedor Docker usando el comando docker run
. Además de esto, también lanzaremos bash
dentro del contenedor.
Código:
~/my-app$ Docker run -it new-image bash
Si enumeramos los archivos dentro del directorio /var/www
, debería ver los archivos app.py
y requirements.txt
.
Código:
root@841d1e8d8c25:/var/www# ls
app.py new_directory requirements.txt
En el contenedor de Docker anterior, los comandos ADD
y COPY
nos han permitido copiar archivos del directorio del host al directorio de Docker.
Sin embargo, al realizar una copia de archivos tan básica en el contenedor Docker, recomendamos usar el comando COPY
.
De acuerdo con las mejores prácticas de docker-file, el comando COPY
es más apropiado cuando no requerimos más funcionalidad que copiar archivos locales.
El comando AÑADIR
, por otro lado, tiene más funcionalidad. Por ejemplo, puede usar este comando para extraer un archivo tar
local en una imagen de Docker.
Además de esto, el comando AÑADIR
tiene soporte para URL remotas, y estas dos operaciones no son posibles con el comando COPIAR
. El comando anterior puede no ser deseable si intenta reducir el tamaño de la imagen de Docker que está creando.
Esto se debe a que el comando AÑADIR
puede inflar significativamente el tamaño de su imagen de Docker, especialmente si está obteniendo paquetes de URL remotas.
El uso del comando AÑADIR
para simplemente copiar archivos del host puede hacer que los archivos se copien inesperadamente en el sistema de archivos de su imagen de Docker.
En conclusión, si bien estos dos comandos comparten similitudes y se pueden usar indistintamente, debe ceñirse al uso del comando COPY
. Por otro lado, el comando AÑADIR
sólo podrá utilizarse cuando sea necesario y con sumo cuidado.
Isaac Tony is a professional software developer and technical writer fascinated by Tech and productivity. He helps large technical organizations communicate their message clearly through writing.
LinkedIn