Estoy aprendiendo Docker y tengo dudas sobre cuándo y dónde usar ADDy 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 -vpuede 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.

COPYaADD. Son casi iguales, peroADDtienen algunas capacidades adicionales con URL y archivos de almacenamiento que pueden resultar sorprendentes.Respuestas:
AÑADIR
La diferencia fundamental entre estos dos es que
ADDhace 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 laADDcapa seguirá existiendo como parte de la imagen. Para ser claros, solo tieneADDalgo en tiempo de compilación y nunca puede hacerloADDen tiempo de ejecución.Algunos ejemplos de casos en los que le gustaría usar
ADD:ADD ./requirements.txt /requirements.txtseguido deRUN pip install -r /requirements.txtDesea 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_appWORKDIR /usr/local/git/my_appCMD python ./main.pyVOLUMEN
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
VOLUMEdirectorio 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_appagregandoVOLUME /var/log/my_appa su Dockerfile y luego ejecutando su contenedor condocker run -v /host/log/dir/my_app:/var/log/my_app some_repo/some_image:some_tagVOLUME /etc/settings/my_app_settingsa su Dockerfile, ejecutar su contenedordocker run -v /host/settings/dir:/etc/settings/my_app_settings some_repo/some_image:some_tagy 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
VOLUMEinstrucción crea un volumen de datos en su contenedor Docker en tiempo de ejecución. El directorio proporcionado como argumentoVOLUMEes 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 laMountssección que hay unSourceque representa la ubicación del directorio en el host y unDestinationque 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 laVOLUMEinstrucción en su Dockerfile.docker run -v $host_path:$container_path: Esto le permite montar$host_pathdesde su host$container_pathen 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_pathy$container_pathdeben ser caminos absolutos.docker run -v my_volume:$container_path: Esto crea un volumen de datos en su contenedor$container_pathy 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
ADDoCOPYinstrucciones en su Dockerfile. Estos son los que suelo utilizar para la implementación que no es de desarrollo.fuente
ADDinstrucción en su Dockerfile, ya que solo la ejecuta eldocker buildcomando. 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.-vcomando para el desarrollo, y hacer que otro archivo acoplable cree una imagen que incluya los archivosADDpara la implementación?ADDdura 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.