代码之家  ›  专栏  ›  技术社区  ›  Raphael Rafatpanah

Docker匿名卷

  •  22
  • Raphael Rafatpanah  · 技术社区  · 7 年前

    我在中看到了Docker体积定义 docker-compose.yml 这样的文件:

    -v /path/on/host/modules:/var/www/html/modules
    

    我注意到了 Drupal's official image 他们的 文件正在使用 anonymous volumes .

    volumes:
      - /var/www/html/modules
      - /var/www/html/profiles
      - /var/www/html/themes
      # this takes advantage of the feature in Docker that a new anonymous
      # volume (which is what we're creating here) will be initialized with the
      # existing content of the image at the same location
      - /var/www/html/sites
    

    有没有办法在容器运行后将匿名卷与主机上的路径相关联?如果没有,那么拥有匿名卷有什么意义?

    完全docker撰写。yml示例:

    version: '3.1'
    
    services:
    
      drupal:
        image: drupal:8.2-apache
        ports:
          - 8080:80
        volumes:
          - /var/www/html/modules
          - /var/www/html/profiles
          - /var/www/html/themes
          # this takes advantage of the feature in Docker that a new anonymous
          # volume (which is what we're creating here) will be initialized with the
          # existing content of the image at the same location
          - /var/www/html/sites
        restart: always
    
      postgres:
        image: postgres:9.6
        environment:
          POSTGRES_PASSWORD: example
        restart: always
    
    4 回复  |  直到 7 年前
        1
  •  17
  •   BitMask777    7 年前

    添加更多信息以回答@Jefferson的后续问题/评论,询问匿名卷如何增加灵活性,并回答OP中的这个问题:

    有没有办法在容器运行后将匿名卷与主机上的路径相关联?如果没有,那么拥有匿名卷有什么意义?

    :您可以通过“数据容器”将特定匿名卷与正在运行的容器相关联,但这提供了灵活性,可以涵盖一个用例,现在使用命名卷可以更好地服务于该用例。

    在1.9之前,由于无法命名卷,您必须首先创建数据容器来引用它

    docker create -v /data --name datacontainer mysql
    

    docker run -d --volumes-from datacontainer --name dbinstance mysql
    

    现在,使用命名卷更好,因为它们更容易管理,更显式。

        2
  •  6
  •   Ricardo Branco    7 年前

    匿名卷是 相等的 匿名卷(如果未显式映射到主机)。

    拥有它们的意义在于增加了灵活性。

    PD: 匿名卷已经驻留在主机中/var/lib/docker(或您配置的任何目录)的某个位置。要查看它们的位置:

    docker inspect --type container -f '{{range $i, $v := .Mounts }}{{printf "%v\n" $v}}{{end}}' $CONTAINER

    $CONTAINER 使用容器的名称。

        3
  •  4
  •   Vlastimil Cervenka    4 年前

    目前,匿名卷的一个可能用例是与绑定装载结合使用。当您想绑定一些文件夹但没有任何特定子文件夹时。然后,应将这些特定子文件夹设置为命名卷或匿名卷。它将保证这些子文件夹将出现在您的容器文件夹中,该文件夹在容器外部绑定,但您根本不必将其放在主机上的绑定文件夹中。

    例如,您可以在容器中构建前端NodeJS项目,其中需要node\u modules文件夹,但您根本不需要这个文件夹进行编码。然后,可以将项目文件夹映射到容器外的某个文件夹,并将node\u modules文件夹设置为匿名卷。即使主机上的工作文件夹中没有Node\u modules文件夹,该文件夹也会一直存在于容器中。

        4
  •  2
  •   x-yuri    3 年前

    1. 之后 docker-compose down && docker-compose up -d docker 除非您告诉它,否则不会删除卷。)使用命名卷,您将获得以前附加到容器的卷 docker-compose down .

    因此,您可能不想将不想丢失的数据放入匿名卷(如db或其他)。再说一次,它们不会自己消失。但之后 docker-compose down && docker-compose up -d && docker volume prune

    对于不那么关键的事情(例如 node_modules

    有没有办法在容器运行后将匿名卷与主机上的路径相关联?

    为此,您需要更改设置,例如:。 /var/www/html/modules -&燃气轮机; ./modules:/var/www/html/modules ,然后执行 docker-compose up -d ./modules 。类似地,您可以将匿名卷转换为命名卷。