Почему docker-compose не может использовать вкладки в JSON-совместимом режиме?

#json #docker #docker-compose #yaml

#json #docker #docker-compose #yaml

Вопрос:

При использовании docker-compose я предпочитаю использовать JSON вместо YAML, и согласно официальной документации, предоставленной Docker, его можно использовать:

введите описание изображения здесь

Тем не менее, когда я пытаюсь запустить простой JSON-файл, совместимый с compose, он завершается ошибкой со следующим выводом:

 ERROR: yaml.scanner.ScannerError: while scanning for the next token
found character 't' that cannot start any token
  in "./sample-file.json", line 2, column 1
  

Но, если я заменю вкладки пробелами, независимо от того, сколько (даже без единого пробела), он начнет работать:

 Starting sandbox_apache_1 ... done
Attaching to sandbox_apache_1
apache_1  | AH00558: httpd: Could not reliably...
  

На картинке четко написано «итак, любой файл JSON», что кажется неверным.

Тогда что с этим?

Ответ №1:

TL: DR: docker-compose документация вводит в заблуждение, цитируя функцию YAML 1.2, когда они используют загрузчик на основе YAML 1.1 для загрузки своих .yml файлов.

То, что все работает при удалении вкладок, связано с тем, что вы, по сути, можете иметь очень компактный JSON: {"a":[1,2,3]} без каких-либо пробелов между узлами вообще.


Да, YAML — это надмножество JSON для всех практических целей, но есть несколько вещей, которые вам нужно иметь в виду.

Прежде всего, вы должны взять документацию, в которой неправильно написана аббревиатура (Yaml вместо YAML) и которая напрямую не ссылается на спецификацию, но ссылается на неавторитетную версию с долей скептицизма. Кроме того, в документации используется расширение .yml для docker-compose.yml файла, хотя рекомендуемое расширение файла для файлов YAML, согласно FAQ по yaml.org , существует .yaml с сентября 2006 года.

В спецификации YAML 1.2 указано, что он предназначен как надмножество JSON, но docker-compose использует PyYAML для анализа / загрузки файла YAML и загружает только подмножество YAML 1.1. В YAML были внесены определенные изменения с 1.1 по 1.2, чтобы сделать YAML 1.2 более, но не 100%, надмножеством JSON.

Символы ТАБУЛЯЦИИ разрешены в YAML 1.2 для пробелов, если это не пробел, определяющий отступ. Поскольку JSON — это YAML в стиле flow, в котором отступы не должны быть значительными, вы можете прочитать это, поскольку перед начальным { or [ не должно быть табуляции.

В YAML 1.1 ограничение на использование TAB более серьезное:

Игнорируемый пробел вне скалярного содержимого. Такие пробелы используются для отступов и разделения между токенами. Для обеспечения переносимости символы табуляции не должны использоваться в этих случаях, поскольку разные системы обрабатывают вкладки по-разному.

(т. Е. в YAML 1.1 вы можете использовать символы ТАБУЛЯЦИИ в непрозрачных скалярах).