【问题标题】:ERROR: In file './docker-compose.yml', volume must be a mapping not a string错误:在文件 './docker-compose.yml' 中,卷必须是映射而不是字符串
【发布时间】:2017-05-11 02:38:17
【问题描述】:

问题: 为什么会出现此错误?

错误:在文件“./docker-compose.yml”中,卷“mariavolume”必须是映射而不是字符串。

我的 docker-compose 文件几乎与这个相同:https://docs.docker.com/compose/wordpress/

version: '2'
services:
  wordpress:
    image: wordpress:latest
    restart: always
    depends_on:
      - db
    ports:
      - 8080:80
    environment:
      WORDPRESS_DB_PASSWORD: example
      WORDPRESS_DB_HOST: 3306
  db:
    image: mariadb
    restart: always
    environment:
      MYSQL_ROOT_PASSWORD: example
    volumes:
      - maria_volume: /var/lib/mysql
volumes:
  maria_volume: ~/mariadb

【问题讨论】:

    标签: wordpress docker-compose docker-volume


    【解决方案1】:

    发生这种情况是因为我错过了在卷名后添加:

    代替:

    volumes:
        - mysqldata:
    

    我输入了:

    volumes:
        - mysqldata
    

    docker-compose up 给了我和上面一样的错误。

    【讨论】:

      【解决方案2】:

      很遗憾,没有这样的功能。

      您无法在 docker-compose 中映射顶级卷。

      以下是选项:

      • 为每个容器添加卷并将其映射到那里。 (就像丹尼尔所做的那样here
      • 在撰写之外创建一个卷(带有映射)并在您的撰写中使用它。

        volumes:
           maria_volume: 
               external:
                   name: volume-name
        

      【讨论】:

      • 这不是真的,你也可以映射顶级卷。
      【解决方案3】:

      我自己刚刚解决了这个问题。如果您只是想要一个卷来存储数据,请执行以下操作。这将创建/重用作为Docker 图形驱动程序的一部分持久化到磁盘的volume

      下一个问题是这是哪里?

      你可以在 docker 镜像里面找到 - 默认位置 -

      C:\Users\Public\Documents\Hyper-V\虚拟硬盘

      db:
        image: mariadb
        restart: always
        environment:
          MYSQL_ROOT_PASSWORD: example
        volumes:
          - maria_volume: /var/lib/mysql
      
      volumes:
        maria_volume:
      

      当然,如果您是在将主机目录映射到 docker 之后,而不是将其放在 Docker 图形驱动程序中。然后你可以这样做。

      db:
        image: mariadb
        restart: always
        environment:
          MYSQL_ROOT_PASSWORD: example
        volumes:
          - maria_volume: /var/lib/mysql
      
      volumes:
        maria_volume:
          driver: local
          driver_opts:
            o: bind
            type: none
            device: /C/mariadb
      

      请注意,当将主机目录映射为卷时(至少在 Windows 上),您可能会遇到 read/write 权限问题,这是我自己尚未解决的问题。

      【讨论】:

      • 谢谢,它对我有用 :) 你拯救了我的一天 :)
      • 您好,想知道您是否找到解决 Windows 上的读/写权限问题的解决方案,谢谢。
      • @bouchepat 我在 Windows 上发现将您的数​​据从 WSL linux 分区移到您的驱动器上,例如/c/docker/data 为我修复了读/写权限
      • 这对我有用,但我使用的是 Linux,通常这是 /var/lib/docker 并且有文件夹卷。要查找您的 docker 根目录,只需键入 docker info | grep "Docker Root Dir"
      【解决方案4】:

      试试这个:

          volumes:
              - maria_volume: /var/lib/mysql
      volumes:
          maria_volume: 
              external:
                  name: ~/mariadb
      

      【讨论】:

      • 谢谢,但这给了我这个语法错误:volumes.maria_volume.external contains an invalid type, it should be a boolean, or an object
      • 空间很重要:name:<space>...
      【解决方案5】:

      卷的正确语法是
      volumes: first:
      其中 first 只是用于卷的占位符名称

      【讨论】:

        【解决方案6】:

        试试这个:

        version: '2'
        services:
          ...
          db:
            image: mariadb
            restart: always
            environment:
              MYSQL_ROOT_PASSWORD: example
            volumes:
              - ~/mariadb:/var/lib/mysql
        

        【讨论】:

          【解决方案7】:

          试试这个,它对我有用

             volumes:
               - maria_volume: /var/lib/mysql
          
          volumes:
            maria_volume: 
              drive: local
          

          【讨论】:

            【解决方案8】:

            我遇到了和你一样的问题,作为绝望的最后一招,我尝试了

            volumes:
              - maria_volume: /var/lib/mysql
            

            之前

            environment:
              MYSQL_ROOT_PASSWORD: example
            

            我不确定这里应用了什么样的魔法,但就我而言,它起作用了

            告诉我!

            【讨论】:

            • 谢谢,是的,这行得通,但是您不再在整个撰写文件中使用单个命名卷,而是根据硬编码到文件夹的服务版本 1 docker-compose 样式手动执行此操作
            【解决方案9】:

            对我来说这是可行的:

            在#docker_compose.yml:

            volumes:
              postgres_data: {}
              static: { }
            

            【讨论】:

              猜你喜欢
              • 2018-12-28
              • 2017-12-17
              • 2020-08-17
              • 2016-10-04
              • 2018-09-30
              • 2021-07-07
              • 2018-06-02
              • 2019-03-17
              • 2018-09-23
              相关资源
              最近更新 更多