Почему в Docker Compose необходимо экранировать порты?

Ответ

В 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" # Рекомендуется для единообразия и предотвращения потенциальных проблем

Ответ 18+ 🔞

А, вот эта тема про кавычки в Docker Compose, блядь! Ну, слушай, сейчас разжуёшь, как кот сука собака.

В общем, есть у них там, у этих ёбаных YAML-парсеров, прикол. Они, сука, такие умные, что начинают сами додумывать, что ты там написал. Вот представь: пишешь ты 123:456 — а он, этот парсер, такой: «О, ёпта, это что, время? Или, блядь, одно большое число? А может, это шестнадцатеричное, нахуй?» И начинает ебать мозги, вместо того чтобы просто взять и подставить порты как есть.

Поэтому, чтобы не было вот этого вот «сам от себя охуел», когда в пятницу вечером деплой ложится нахуй из-за какой-то хуйни, порты надо в кавычки заворачивать. Особенно когда начинается пиздопроебибна с IP-адресами или протоколами.

Смотри, вот пример, где без кавычек — вроде норм, но это как ходить по охуенно тонкому льду:

ports:
  - 8080:80

А вот где уже точно надо, иначе пиздец:

ports:
  - "127.0.0.1:8080:80"  # Э, бошка думай, тут IP есть! Без кавычек — накрылся медным тазом.
  - "443:443/tcp"         # А тут, сука, протокол приплели! Тоже в кавычки, блядь.

И вообще, чувак, самый надёжный способ — просто всегда, блядь, закавычивать. Даже "8000:8000". Потому что доверия ебать ноль к этим парсерам. Один раз наступишь — и волнение ебать на всю ночь обеспечено.

Короче, правило простое: видишь двоеточие в портах — сразу кавычки, и никаких полупидорских решений. В рот меня чих-пых, зато спать спокойно будешь.