Docker-Compose文件有yaml.scanner.ScannerError

时间:2016-08-22 10:45:21

标签: docker yaml docker-compose dockerfile

compose.yml文件,如下所示:

version: '2'
services:
  discovery-microservice:
    build: discovery-microservice
      context: /discovery-microservice/target/docker
      dockerfile: Dockerfile
  ports:
   - "8761:8761"

当我执行它时,我收到以下错误:

yaml.scanner.ScannerError: mapping values are not allowed here
in "C:\...\docker-compose.yml", line 5, column 14

从我看来,格式没有任何问题,例如:空白丢失了。我的总体目标是指定一个开发模式docker-compose文件,将其指向不同模块的目标目录 我在这里做错了什么?

18 个答案:

答案 0 :(得分:54)

好的,我浪费了大约3个小时来调试类似的问题。

如果你们得到以下错误

ERROR: yaml.scanner.ScannerError: mapping values are not allowed here
in ".\docker-compose.yml", line 2, column 9

因为你需要一个空间

版本:'3'< - 这是错误的

版本:'3'< - 这是正确的。

另外,如果您正在使用eclipse,请帮个忙并安装YEdit YAML编辑器插件

答案 1 :(得分:14)

我在:

之后忘了version
version '2'

答案 2 :(得分:14)

几秒钟后逐字逐句地找到解决方案。您必须删除" discovery-microservice"在" build":

之后
version: '2'
services:
  discovery-microservice:
    build:
      context: ./discovery-microservice/target/docker
      dockerfile: Dockerfile
    ports:
     - "8761:8761"

你也可以使用" ./"在相对路径的上下文中。 :)

答案 3 :(得分:5)

这里有什么问题:

    build: discovery-microservice

启动一个映射,其中键build缩进四个空格。该键的值是一个以discovery-microservice开头的标量,可能会继续到下一行,具体取决于是否在同一缩进级别对{strong>

在这样的多行标量中不允许的是,您有一个不带引号的key: value 具有不同的缩进级别。这正是你所拥有的。

看到:缩进到与context不同的级别的解析器假设您正在编写一个标量字符串build,该字符串不能在同一行上跟踪(discovery-microservice context)用冒号。

除了在你的答案中删除context之后,还有什么能使这个有效的YAML(但具有不同的含义,对于docker compose可能没有意义)是:

discovery-microservice

services:
  discovery-microservice:
    build: "discovery-microservice
      context: /discovery-microservice/target/docker"

对于docker-compose版本2文件,services: discovery-microservice: build: discovery-microservice context: /discovery-microservice/target/docker" 键需要映射(而不是上面的"解决方案"中的标量),使您的答案成为解决此问题的正确方法。

答案 4 :(得分:2)

还要确保您的上下文和dockerfile具有相同的标识。我犯了一个错误,被困了几个小时。

我的错误是

错误:yaml.scanner.ScannerError:此处不允许映射值 在“ ./docker-compose.yml”的第6行第19列

错误:

version : '3'
services:
  test:
    build:
      context: ./test
        dockerfile: Dockerfile.test
    image: kpod/test:2020

右:

version : '3'
services:
  test:
    build:
      context: ./test
      dockerfile: Dockerfile.test
    image: kpod/test:2020

答案 5 :(得分:2)

带上我的答案,因为虽然我收到相同的错误消息,但解决方案却不同。

原始docker-compose.yml

volumes: mongo:

尝试了该线程中的所有想法之后,我进入了docker-compose码头,并意识到卷的结构应如下:

volumes:
  mongo:

就是其他人遇到的问题。

答案 6 :(得分:1)

我遇到了同样的问题,我认为可能是您的 yaml 文件格式无效。所以为了解决这个问题,首先我们需要确保我们的yaml文件格式是有效的

以下是您的原始代码片段

version: '2'
services:
  discovery-microservice:
    build: discovery-microservice
      context: /discovery-microservice/target/docker
      dockerfile: Dockerfile
  ports:
   - "8761:8761"

如果我们使用http://www.yamllint.com/检查yaml文件,我们会得到如下错误: enter image description here

然后我们将其更改如下:

services: 
  discovery-microservice: 
    build: discovery-microservice
    context: /discovery-microservice/target/docker
    dockerfile: Dockerfile
  ports: 
    - "8761:8761"
version: "2"

检查后,我们将得到如下结果:

enter image description here

答案 7 :(得分:1)

使用vs代码yaml RedHat扩展,我发现自己缩进了一个凹痕:

错误:

print(json.dumps(entry))
import sys
sys.stdout.flush()

右:

version: '3'

services:

  web:
    image: nginx
     ports:
    - 9090:80

  database:
    image: redis

答案 8 :(得分:1)

如果您使用的是vs code,请帮个忙,并通过“ RedHat”安装YAML扩展名。

答案 9 :(得分:0)

我想要一个映射到外部(主机)服务器上特定路径的卷。我尝试将其放在volumes的顶级docker-compose.yml条目下。在查看了docker-compose文件文档之后,我意识到那种类型的卷并不存在。相反,它仅位于容器定义内的volumes条目下。例如:

version: "3.7"
services:
  web:
    image: my_custom_web_image
    build: ./app
    volumes:
      - ./app/subdir:/usr/src/app/subdir

答案 10 :(得分:0)

检查您的空格by validating your YAML input.

我花了1个小时来找出答案。

答案 11 :(得分:0)

1)每当定义键后进行映射时,在每个冒号后都留一个空格。

2)YAML文件使用2(两个空格或制表符)缩进。 ->这意味着每行之后,当您在下一行中写一个句子时,您需要使用两个选项卡。 我希望这可以使现在轻松编写任何YAML文件。

答案 12 :(得分:0)

因此,还有另一个原因! 当您尝试使用Github中的setup.sh安装r = Redash时,脚本会自动获取最新版本的Redash,并将其放入docker-compose.yml中。 yml基本文件的版本名称周围没有单引号(')!结果,您收到一条错误消息:

错误:yaml.scanner.ScannerError:此处不允许映射值 在“ ./docker-compose.yml”的第3行第23列中 您只需在Redash版本周围添加单引号即可:

version: "2"
x-redash-service: &redash-service
  image: 'redash/redash:8.0.0.b32245'

答案 13 :(得分:0)

另一个可能的罪魁祸首是文件结尾处的杂乱标签,这是我今天了解到的。

答案 14 :(得分:0)

您好,将其更新为给定的答案....并非专门针对版本:“ 2.0”行 声明

  

错误:yaml.scanner.ScannerError:此处不允许使用映射值

意味着存在某种格式错误。

我明白了,那是因为我在docker-compose文件中缺少一个标签页

import { Directive, ElementRef, Renderer2, HostListener } from '@angular/core';
import { NgControl } from '@angular/forms';

@Directive({
  selector: '[appSsnMask]'
})
export class SsnMaskDirective {

  visible = false;
  toggleElem;
  toggleElemATag;
 toggleElemITag;
  parentElem;
  inputElem;
  private value: any;
  private element: HTMLInputElement;

  constructor(
    private elem: ElementRef,
    private renderer: Renderer2,
    public formControl: NgControl
  ) {
    this.element = elem.nativeElement;
  }

  ngOnInit() {
    this.inputElem = this.elem.nativeElement;
    this.parentElem = this.inputElem.parentElement;

    // create toggle button
    this.toggleElem = this.renderer.createElement('span');
    this.toggleElemATag = this.renderer.createElement('a');
    this.toggleElemITag = this.renderer.createElement('i');

    this.renderer.addClass(this.toggleElemITag, 'fa');
    this.renderer.addClass(this.toggleElemITag, 'fa-eye');

    // append toggle element to input element holder
    this.renderer.appendChild(this.toggleElem, this.toggleElemATag);
    this.renderer.appendChild(this.toggleElemATag, this.toggleElemITag);
    this.renderer.appendChild(this.parentElem, this.toggleElem);

    // listen to event on toggle button
    this.renderer.listen(this.toggleElemATag, 'mousedown', this.toggleMask.bind(this));
    this.value = this.element.value;
    this.maskValue(true);
  }

  toggleMask(e) {
    e.preventDefault();
    this.visible = !this.visible;
    if (this.visible) {
      this.showSlashIcon();
    } else {
      this.showEyeIcon();
    }
    this.maskValue(!this.visible);
  }

  eyeStatus(status) {
    if (status) {
      this.showEyeIcon();
    } else {
      this.showEyeIcon();
    }
  }

  showSlashIcon() {
    this.renderer.removeClass(this.toggleElemITag, 'fa-eye');
    this.renderer.addClass(this.toggleElemITag, 'fa-eye-slash');
  }

  showEyeIcon() {
    this.renderer.removeClass(this.toggleElemITag, 'fa-eye-slash');
    this.renderer.addClass(this.toggleElemITag, 'fa-eye');
  }

  @HostListener('input')
  onChange() {
    this.value = this.element.value;
    this.maskValue(!this.visible);
  }

  @HostListener('focus')
  focusListener() {
    this.renderer.appendChild(this.parentElem, this.toggleElem);
  }

  @HostListener('blur')
  blurListener() {
    if (this.formControl.control.invalid && this.formControl.control.errors
      && this.formControl.control.dirty && this.formControl.control.touched) {
      this.renderer.removeChild(this.parentElem, this.toggleElem);
    } else {
      this.renderer.appendChild(this.parentElem, this.toggleElem);
    }
  }

  maskValue(status) {
    if (status) {
      this.element.value = this.element.value.replace(/[0-9]/g, 'x');
    } else {
      this.element.value = this.value;
    }
  }
}

代替

version: '3.0'
services:
  mysql:
  image: ...

请注意图像行上没有缩进标签

答案 15 :(得分:0)

检查之间的空格

端口:

-_space_“ 8080:8080”

答案 16 :(得分:0)

我发现缺少一个":"足以产生上述错误

答案 17 :(得分:0)

我今天遇到了类似的问题,docker-compose.yml文件中出现了导致相同错误的语法错误。

version: '2'
services:
// Add your services here
  discovery-microservice:
    build: discovery-microservice
      context: ./discovery-microservice/target/docker
      dockerfile: Dockerfile
  ports:
   - "8761:8761"

删除此行// Add your services here修复了我的问题

version: '2'
services:
  discovery-microservice:
    build:
      context: ./discovery-microservice/target/docker
      dockerfile: Dockerfile
    ports:
     - "8761:8761"

我希望这可以帮助有类似问题的人。