J'apprends Docker et j'ai des doutes sur quand et où utiliser ADD
et VOLUME
. Voici ce que je pense que les deux font:
AJOUTER
Copiez les fichiers sur l'image au moment de la construction. L'image contient tous les fichiers afin que vous puissiez le déployer très facilement. D'un autre côté, avoir besoin de construire à chaque fois ne semble pas être une bonne idée en développement car la construction nécessite que le développeur exécute une commande pour reconstruire le conteneur; de plus, la construction du conteneur peut prendre du temps.
LE VOLUME
Je comprends qu'en utilisant docker run -v
vous pouvez monter un dossier hôte dans votre conteneur, de cette façon, vous pouvez facilement modifier les fichiers et regarder l'application dans votre conteneur réagir aux modifications. Cela a l'air bien en développement, mais je ne sais pas comment déployer mes fichiers de cette façon.
COPY
àADD
. Ils sont presque les mêmes, maisADD
ont des capacités supplémentaires pour les URL et les fichiers d'archive qui peuvent être surprenantes.Réponses:
AJOUTER
La différence fondamentale entre ces deux éléments est que
ADD
tout ce que vous ajoutez, que ce soit un dossier ou juste un fichier, fait partie de votre image . Quiconque utilise l'image que vous avez créée par la suite aura accès à tout ce que vousADD
. Cela est vrai même si vous le supprimez par la suite, car Docker fonctionne en couches et laADD
couche existera toujours dans le cadre de l'image. Pour être clair, vous n'avez queADD
quelque chose au moment de la construction et ne pouvez jamaisADD
au moment de l'exécution.Quelques exemples de cas où vous souhaiteriez utiliser
ADD
:ADD ./requirements.txt /requirements.txt
suivi deRUN pip install -r /requirements.txt
Vous souhaitez utiliser le code de votre application comme contexte dans votre Dockerfile, par exemple, si vous souhaitez définir votre répertoire d'application comme répertoire de travail dans votre image et que la commande par défaut dans un conteneur exécuté à partir de votre image exécute réellement votre application, vous peut faire:
ADD ./ /usr/local/git/my_app
WORKDIR /usr/local/git/my_app
CMD python ./main.py
LE VOLUME
Volume, d'autre part, permet simplement à un conteneur exécuté à partir de votre image d'accéder à un chemin sur n'importe quelle machine locale sur laquelle le conteneur est exécuté. Vous ne pouvez pas utiliser les fichiers de votre
VOLUME
répertoire dans votre Dockerfile . Tout ce qui se trouve dans votre répertoire de volume ne sera pas accessible au moment de la construction, mais le sera au moment de l'exécution .Quelques exemples de cas où vous souhaiteriez utiliser
VOLUME
:/var/log/my_app
. Vous souhaitez que ces journaux soient accessibles sur la machine hôte et ne soient pas supprimés lorsque le conteneur est supprimé. Vous pouvez le faire en créant un point de montage sur/var/log/my_app
en l'ajoutantVOLUME /var/log/my_app
à votre Dockerfile, puis en exécutant votre conteneur avecdocker run -v /host/log/dir/my_app:/var/log/my_app some_repo/some_image:some_tag
VOLUME /etc/settings/my_app_settings
à votre Dockerfile, d'exécuter votre conteneur avecdocker run -v /host/settings/dir:/etc/settings/my_app_settings some_repo/some_image:some_tag
et de vous assurer que le / host / settings / dir existe dans tous les environnements dans lesquels vous vous attendez à ce que votre application soit exécutée.la source
docker run -v $HOST_PATH:$CONTAINER_PATH node:latest node $CONTAINER_PATH/app.js
.L'
VOLUME
instruction crée un volume de données dans votre conteneur Docker au moment de l'exécution. Le répertoire fourni en tant qu'argumentVOLUME
est un répertoire qui contourne le système de fichiers Union et est principalement utilisé pour les données persistantes et partagées.Si vous exécutez
docker inspect <your-container>
, vous verrez dans laMounts
section il y a unSource
qui représente l'emplacement du répertoire sur l'hôte, et unDestination
qui représente l'emplacement du répertoire monté dans le conteneur. Par exemple,Voici 3 cas d'utilisation pour
docker run -v
:docker run -v /data
: Cela revient à spécifier l'VOLUME
instruction dans votre Dockerfile.docker run -v $host_path:$container_path
: Cela vous permet d'effectuer un montage$host_path
depuis votre hôte vers$container_path
votre conteneur pendant l'exécution. En développement, cela est utile pour partager du code source sur votre hôte avec le conteneur. En production, cela peut être utilisé pour monter des éléments tels que les informations DNS de l'hôte (trouvées dans/etc/resolv.conf
) ou des secrets dans le conteneur. Inversement, vous pouvez également utiliser cette technique pour écrire les journaux du conteneur dans des dossiers spécifiques sur l'hôte. Les deux$host_path
et$container_path
doivent être des chemins absolus.docker run -v my_volume:$container_path
: Cela crée un volume de données dans votre conteneur à$container_path
et le nommemy_volume
. C'est essentiellement la même chose que de créer et de nommer un volume à l'aide dedocker volume create my_volume
. Nommer un volume comme celui-ci est utile pour un volume de données de conteneur et un volume de stockage partagé à l'aide d'un pilote de stockage multi-hôte comme Flocker .Notez que l'approche consistant à monter un dossier hôte en tant que volume de données n'est pas disponible dans Dockerfile. Pour citer la documentation du docker ,
Désormais, si vous souhaitez copier vos fichiers dans des conteneurs dans des environnements sans développement, vous pouvez utiliser les instructions
ADD
ouCOPY
de votre Dockerfile. C'est ce que j'utilise habituellement pour un déploiement hors développement.la source
ADD
instruction dans votre Dockerfile, car elle n'est exécutée que par ladocker build
commande. Cela est nécessaire lorsque d'autres personnes créent votre conteneur pour la première fois et lorsque vous êtes prêt à le déployer dans d'autres environnements hors développement.-v
commande pour le développement, et de demander à un autre fichier docker de créer une image qui inclut les fichiers avecADD
pour le déploiement?ADD
? Quelques secondes au total? Si vous avez deux fichiers Dockerfile et que vous le partagez avec d'autres (ou le publiez sur le registre Docker ), lequel est celui par défaut? Vous aurez des frais de maintenance supplémentaires pour vous assurer que le bon Dockerfile par défaut parvient aux bons utilisateurs. Mais à la fin de la journée, vous décidez de ce qui vous convient le mieux. Personnellement, j'aime m'assurer qu'il n'y a qu'un et un seul Dockerfile pour construire mon conteneur.