Estoy aprendiendo Docker y tengo dudas sobre cuándo y dónde usar ADD
y VOLUME
. Esto es lo que creo que hacen ambos:
AÑADIR
Copie archivos a la imagen en el momento de la compilación. La imagen tiene todos los archivos para que puedas implementarla con mucha facilidad. Por otro lado, tener que compilar cada vez no parece una buena idea en desarrollo porque la compilación requiere que el desarrollador ejecute un comando para reconstruir el contenedor; Además, la construcción del contenedor puede llevar mucho tiempo.
VOLUMEN
Entiendo que al usarlo docker run -v
puede montar una carpeta de host dentro de su contenedor, de esta manera puede modificar fácilmente los archivos y ver cómo reacciona la aplicación en su contenedor a los cambios. Se ve muy bien en desarrollo, pero no estoy seguro de cómo implementar mis archivos de esta manera.
COPY
aADD
. Son casi iguales, peroADD
tienen algunas capacidades adicionales con URL y archivos de almacenamiento que pueden resultar sorprendentes.Respuestas:
AÑADIR
La diferencia fundamental entre estos dos es que
ADD
hace que todo lo que esté agregando, ya sea una carpeta o simplemente un archivo, sea parte de su imagen . Cualquiera que use la imagen que ha creado posteriormente tendrá acceso a lo que seaADD
. Esto es cierto incluso si luego lo elimina porque Docker funciona en capas y laADD
capa seguirá existiendo como parte de la imagen. Para ser claros, solo tieneADD
algo en tiempo de compilación y nunca puede hacerloADD
en tiempo de ejecución.Algunos ejemplos de casos en los que le gustaría usar
ADD
:ADD ./requirements.txt /requirements.txt
seguido deRUN pip install -r /requirements.txt
Desea usar el código de su aplicación como contexto en su Dockerfile, por ejemplo, si desea configurar el directorio de su aplicación como el directorio de trabajo en su imagen y hacer que el comando predeterminado en un contenedor se ejecute desde su imagen en realidad ejecute su aplicación, usted puede hacer:
ADD ./ /usr/local/git/my_app
WORKDIR /usr/local/git/my_app
CMD python ./main.py
VOLUMEN
El volumen, por otro lado, solo permite que un contenedor que se ejecuta desde su imagen tenga acceso a alguna ruta en cualquier máquina local en la que se esté ejecutando el contenedor. No puede usar archivos de su
VOLUME
directorio en su Dockerfile . No se podrá acceder a nada en su directorio de volúmenes en el momento de la compilación, pero se podrá acceder en el tiempo de ejecución .Algunos ejemplos de casos en los que le gustaría usar
VOLUME
:/var/log/my_app
. Desea que esos registros sean accesibles en la máquina host y que no se eliminen cuando se elimine el contenedor. Puede hacer esto creando un punto de montaje en/var/log/my_app
agregandoVOLUME /var/log/my_app
a su Dockerfile y luego ejecutando su contenedor condocker run -v /host/log/dir/my_app:/var/log/my_app some_repo/some_image:some_tag
VOLUME /etc/settings/my_app_settings
a su Dockerfile, ejecutar su contenedordocker run -v /host/settings/dir:/etc/settings/my_app_settings some_repo/some_image:some_tag
y asegurarse de que / host / settings / dir exista en todos los entornos en los que espera que se ejecute su aplicación.fuente
docker run -v $HOST_PATH:$CONTAINER_PATH node:latest node $CONTAINER_PATH/app.js
.La
VOLUME
instrucción crea un volumen de datos en su contenedor Docker en tiempo de ejecución. El directorio proporcionado como argumentoVOLUME
es un directorio que pasa por alto el sistema de archivos de la unión. y se usa principalmente para datos persistentes y compartidos.Si ejecuta
docker inspect <your-container>
, verá en laMounts
sección que hay unSource
que representa la ubicación del directorio en el host y unDestination
que representa la ubicación del directorio montado en el contenedor. Por ejemplo,Aquí hay 3 casos de uso para
docker run -v
:docker run -v /data
: Esto es análogo a especificar laVOLUME
instrucción en su Dockerfile.docker run -v $host_path:$container_path
: Esto le permite montar$host_path
desde su host$container_path
en su contenedor durante el tiempo de ejecución. En desarrollo, esto es útil para compartir código fuente en su host con el contenedor. En producción, esto se puede usar para montar cosas como la información DNS del host (que se encuentra en/etc/resolv.conf
) o secretos en el contenedor. Por el contrario, también puede utilizar esta técnica para escribir los registros del contenedor en carpetas específicas en el host. Ambos$host_path
y$container_path
deben ser caminos absolutos.docker run -v my_volume:$container_path
: Esto crea un volumen de datos en su contenedor$container_path
y lo nombramy_volume
. Es esencialmente lo mismo que crear y nombrar un volumen usandodocker volume create my_volume
. Nombrar un volumen como este es útil para un volumen de datos de contenedor y un volumen de almacenamiento compartido utilizando un controlador de almacenamiento de múltiples hosts como Flocker .Tenga en cuenta que el enfoque de montar una carpeta de host como un volumen de datos no está disponible en Dockerfile. Para citar la documentación de Docker ,
Ahora, si desea copiar sus archivos a contenedores en entornos que no son de desarrollo, puede usar
ADD
oCOPY
instrucciones en su Dockerfile. Estos son los que suelo utilizar para la implementación que no es de desarrollo.fuente
ADD
instrucción en su Dockerfile, ya que solo la ejecuta eldocker build
comando. Esto es necesario cuando otros crean su contenedor por primera vez y cuando está listo para implementarlo en otros entornos que no son de desarrollo.-v
comando para el desarrollo, y hacer que otro archivo acoplable cree una imagen que incluya los archivosADD
para la implementación?ADD
dura la construcción con una toma de todos modos? ¿Un par de segundos en total? Si tiene dos archivos Dockerfile y los comparte con otros (o lo publica en el registro de Docker ), ¿cuál es el predeterminado? Tendrá una sobrecarga de mantenimiento adicional para garantizar que el Dockerfile predeterminado correcto llegue a los usuarios correctos. Pero al final del día, usted decide qué funciona mejor para usted. Personalmente, me gusta asegurarme de que haya un solo Dockerfile para construir mi contenedor.