#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 вы можете использовать символы ТАБУЛЯЦИИ в непрозрачных скалярах).