Ответ
В Docker Compose порты необходимо экранировать (заключать в кавычки) в файлах docker-compose.yml из-за особенностей парсинга формата YAML. YAML-парсер может некорректно интерпретировать некоторые числовые или строковые комбинации, если они не заключены в кавычки.
Основные причины экранирования:
- Сложные форматы сопоставления портов: Когда требуется указать не только номера портов, но и IP-адрес хоста или протокол.
- Пример:
"127.0.0.1:8080:80"(привязка к конкретному IP) - Пример:
"443:443/tcp"(явное указание протокола)
- Пример:
- Предотвращение ошибок парсинга YAML: Некоторые комбинации чисел, разделенные двоеточием, могут быть интерпретированы YAML как специальные типы данных (например, время, шестнадцатеричные числа или даже одно большое число).
- Например,
123:456без кавычек может быть ошибочно воспринято как число123456или как время. Экранированиеports: - "123:456"гарантирует, что строка будет прочитана как есть.
- Например,
- Использование переменных окружения: Если часть строки порта формируется из переменной окружения, кавычки обеспечивают корректную интерполяцию и парсинг.
Пример без экранирования (для простых случаев, где кавычки не обязательны):
ports:
- 8080:80
Пример с экранированием (обязательно для сложных случаев и для надежности):
ports:
- "127.0.0.1:8080:80"
- "443:443/tcp"
- "8000:8000" # Рекомендуется для единообразия и предотвращения потенциальных проблем