Docker Compose,约束 - 没有找到预期的键

12
我们使用Docker CE(最新版本)和Docker Compose版本3。我有一个.yml文件,其中包含3个服务,但我想约束Grafana只在Swarm的主节点上运行。当我添加约束时,出现了以下错误:
``` yaml: line 32: did not find expected key ```
脚本如下:
version: '3'
services:
  influxdb:
    image: "influxdb:latest"
    volumes:
      - /mount/set/influxdb:/var/lib/influxdb
    ports:
      - "5076:5076"
    networks:
      - production

  kapacitor:
    image: "kapacitor:latest"
    environment:
      KAPACITOR_HOSTNAME: kapacitor
      KAPACITOR_INFLUXDB_0_URLS_0: http://influxdb:5086
    volumes:
      - /mount/set/kapacitor:/var/lib/kapacitor
    ports:
      - "9092:9092"
    networks:
      - production

  grafana:
    image: "grafana/grafana:latest"
      ports:
        - "7000:7000"
      networks:
        - production
      deploy:
        placement:
          constraints: [node.role == manager]
      volumes:
        - /iSCSIDisk/grafana/grafana.ini:/etc/grafana/grafana.ini
        - /iSCSIDisk/grafana/lib:/var/lib/grafana
      environment:
        GF_SECURITY_ADMIN_PASSWORD: secretsecret

      networks:
        production:
          external: true

我已经对脚本进行了多次检查,但无法找到错误的原因。可能是我忽略了什么,我检查了非空格等情况,没有发现任何问题,我还检查了其他有关相同错误的文章,也没有发现任何缺少括号或重复的情况。感谢您的帮助,谢谢。 :)

4个回答

22

您的grafana部分缩进存在问题。在image之后的所有内容都多了两个空格。


非常感谢!我猜yml文件就是这么挑剔 :) - Martin Nikolaev Ivanov
是的,有人在制作yml语法时借鉴了Python手册。 - BMitch
哇,我花了一个半小时在我的.yaml文件里研究类似的问题 - 谢谢你解决了这个问题。真气人 :-) - vipes

2

在使用docker-compose.yml文件时,常见错误是多出了空格。如果您使用vi或vim编辑器,可以使用命令:%s/\s\+$//e来删除所有多余的空格。


0
这可能是因为您正在使用字典类型声明环境变量。
在我的情况下,我不得不更改格式。
environment:      
  DATASTORE_EMULATOR_HOST: "${DATASTORE_ENDPOINT}:${DATASTORE_PORT}"

environment:
  - DATASTORE_EMULATOR_HOST=${DATASTORE_ENDPOINT}:${DATASTORE_PORT}

对我来说唯一改变的是升级我的 Docker 桌面安装


0
你已经得到了答案,但我刚刚发现了另一个(事后显而易见的)问题:当一个值用双引号引起来时,如果该值中包含双引号。

E.g.:

...
environment:
  PASSWORD: "a"123"
...

要解决这个问题,应该使用单引号:

...
environment:
  PASSWORD: 'a"123'
...

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接