Docker Composer, Constraint - Did Not Find Expected Key

We using docker CE(latest) and docker composer version 3.I have a .yml for for 3 services but I want to constraint grafana to the master of the swarm. When adding the constraint I get

yaml: line 32: did not find expected key Tthe script is this:

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: 
    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

I combed over the script several times and could not find any reason for the error, I may be overlooking something, I checked for non-spaces etc, and could not find anything, I checked other articles regarding the same error, and I don't seem to have any missing brackets or duplicates too. Your help will be much appreciated, thank you. :)

4 Answers

Your indentation is broken in the grafana section. Everything after image is spaced in two extra spaces.

3

It is common error with docker-compose.yml file depend on extra spaces. If you use vi or vim you can remove all extra spaces with :%s/\s\+$//e command.

This can happen if you are using dictionary type declarations for your environment variables.

In my case I had to change the format

environment:      
  DATASTORE_EMULATOR_HOST: "${DATASTORE_ENDPOINT}:${DATASTORE_PORT}"

to

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

The only thing that changed for me was upgrading my docker desktop installation

You've got your answer already, but I just stumbled on another (in hindsight obvious) issue: double quotes in a value when it is quoted with double quotes.

E.g.:

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

To fix, one should use single quotes:

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

Your Answer

By clicking “Post Your Answer”, you agree to our terms of service and acknowledge that you have read and understand our privacy policy and code of conduct.

Sarah Jenkins

Sarah Jenkins

Senior Technology Editor & AI Specialist

Sarah Jenkins is a veteran tech journalist with over 12 years of experience covering artificial intelligence, mobile innovations, and digital ethics. Her insights have appeared in leading technology publications worldwide.

Share this article
Twitter Facebook Pinterest