Maison  >  Questions et réponses  >  le corps du texte

Dockerfile 中的Volume有什么意义,光用docker run -v效果相同吗?

Dockerfile 中有一个 VOLUME 命令,可以把挂载一个目录到主机目录,但是在主机目录下的名字是随机的,除非用户用 -v 指定,但是如果在 Dockerfile 中不用 VOLUME,只在运行时用 -v 指定也能达到效果,那么就有一个问题,VOLUMEDockerfile 中到底有多少用,在 Host 下创建了几个用户一般找不到的文件到底有多少使用价值,大部分情况下用户都是要手动使用 -v 重新指定挂载目录,那 VOLUME 命令就显得很鸡肋。

VOLUME 是否有什么比较重要的用处我没有理解呢?

PHP中文网PHP中文网2707 Il y a quelques jours605

répondre à tous(2)je répondrai

  • 迷茫

    迷茫2017-04-24 09:11:15

    J'ai aussi quelques questions à ce sujet, j'ai donc trouvé quelques informations et exprimé mon opinion.

    J'ai trouvé le guide d'utilisation officiel : https://docs.docker.com/engine/userguide...

    J'en ai appris quelque chose : VOLUME n'est pas seulement une instruction, il rechargera le chemin spécifié. J'ai également découvert cela via le conteneur d'inspection.

    Il s'agit du VOLUME spécifié dans le Dockerfile, sans spécifier -v. Affichez les informations de montage du conteneur :

    .
    "Mounts": [
            {
                "Name": "b3e2dcacd3f9f40b43ccd5773d45ca74f0f49b02d3da17749cb378ff9f59bb67",
                "Source": "/var/lib/docker/volumes/b3e2dcacd3f9f40b43ccd5773d45ca74f0f49b02d3da17749cb378ff9f59bb67/_data",
                "Destination": "/etc",
                "Driver": "local",
                "Mode": "",
                "RW": true
            }
        ],

    Ceci est basé sur le précédent, en spécifiant -v pour afficher les informations de montage du conteneur :

     "Mounts": [
            {
                "Source": "/etc",
                "Destination": "/etc",
                "Mode": "",
                "RW": true
            }
        ],

    Ensuite, allez dans le répertoire /var/lib/docker/volumes/b3e2dcacd3f9f40b43ccd5773d45ca74f0f49b02d3da17749cb378ff9f59bb67/_data et jetez un œil, et ce sera à peu près clair.

    Vous pouvez comprendre VOLUME comme la copie du dossier du volume spécifié de l'image vers le /var/lib/docker/volumes/xxxxxxxxx/文件夹 local, puis le montage du dossier local dans le conteneur.

    Essentiellement, cela équivaut simplement à monter un dossier local.

    Continuez à ajouter, car VOLUME crée en fait un nouveau dossier localement et le monte, il existe donc en fait trois situations pour le dossier à l'intérieur du conteneur :
    1 Ni VOLUME ni -v ne sont spécifiés. .
    2. VOLUME est spécifié sans -v. Ce type de dossier peut être partagé entre différents conteneurs, mais ne peut pas être modifié localement.
    3. Les dossiers avec -v spécifié peuvent être partagés entre différents conteneurs et peuvent être modifiés localement.

    Énumérons une situation qui doit être partagée entre différents conteneurs et n'a pas besoin d'être modifiée localement.

    Tout d'abord, nous comprenons d'abord comment obtenir des données dynamiques dans le conteneur :
    1. Fournir localement, monter sur le conteneur
    2. Fournir à distance, télécharger à distance
    3. Générer et fournir , à l'intérieur du conteneur Générer

    Aucune de ces deux dernières commandes ne doit être modifiée localement, mais les données dynamiques qu'elles génèrent devront peut-être être partagées.
    Les commandes de téléchargement, telles que git clone, extraient le code directement du serveur git sans monter le dossier local.
    Pour générer des commandes, telles que jekyll (générateur de site Web statique), vous pouvez monter un dossier de code, puis les fichiers de page Web statique générés dans le répertoire de construction doivent être fournis au serveur Apache, vous devez alors spécifier le construire le répertoire en tant que VOLUME.

    répondre
    0
  • 高洛峰

    高洛峰2017-04-24 09:11:15

    La commande

    VOLUME est principalement utile dans un environnement de développement :

    1. Lors de la modification du code, modifiez-le directement sur la machine hôte, puis exécutez-le de manière synchrone dans Docker. Il n'est pas nécessaire de démarrer et d'arrêter à plusieurs reprises. Cela peut maximiser les performances de l'environnement de développement.

    2. Pour VOLUME je préfère utiliser docker-compose pour la spécification :

    db:
      image: postgres
    web:
      build: .
      command: python manage.py runserver 0.0.0.0:8000
      volumes:
        - .:/code
      ports:
        - "8000:8000"
      links:
        - db

    docker-compose peut regrouper et exécuter plusieurs services. L'exemple ci-dessus consiste à exécuter des services Web et des services de base de données séparément, ce qui est très approprié pour créer des environnements complexes.

    répondre
    0
  • Annulerrépondre