Saltar al contenido

YAML, Docker Compose, espacios y citas

Traemos la mejor solución que encontramos por todo internet. Nuestro deseo es que te sirva de ayuda y si deseas comentarnos algún detalle que nos pueda ayudar a mejorar hazlo con libertad.

Solución:

Después de buscar en Google, encontré una publicación de blog que toca este problema tal como lo entendí.

Voy a citar la parte más importante aquí:

plain scalars:
- a string
- a string with a  backslash that doesn't need to be escaped
- can also use " quotes ' and $ a % lot /&?+ of other  [] stuff

single quoted:
- '& starts with a special character, needs quotes'
- 'this  backslash also does not need to be escaped'
- 'just like the " double quote'
- 'to express one single quote, use '' two of them'

double quoted:
- "here we can use predefined escape sequences like t n b"
- "or generic escape sequences x0b u0041 U00000041"
- "the double quote " needs to be escaped"
- "just like the \ backslash"
- "the single quote ' and other characters must not be escaped"

literal block scalar: |
  a multiline text
  line 2
  line 3

folded block scalar: >
  a long line split into
  several short
  lines for readability

Además, no he visto tal sintaxis de docker-compose para establecer variables env. La documentación sugiere usar valores simples como

environment:
  - ENV1=abc
  - "ENV2=abc"

donde comillas " o ' son opcionales en este ejemplo particular según lo que he dicho antes.

Para ver cómo incluir espacios en las variables env, puede consultar esto para responder

Si necesita o no comillas, depende del analizador. Docker-compose AFAIK sigue confiando en el módulo PyYAML, que implementa la mayor parte de YAML 1.1 y tiene algunas peculiaridades propias.

En general, solo necesita citar lo que de otro modo podría malinterpretarse o chocar con alguna construcción YAML que no es un escalar string. También necesita comillas (dobles) para cosas que no se pueden representar en escalares simples, escalares entre comillas simples o escalares literales o plegados de estilo de bloque.

Mala interpretación

Debe citar cadenas que se parezcan a algunas de las otras estructuras de datos:

  • booleanos: “Verdadero”, “Falso”, pero PyYAML también asume palabras alternativas como “Sí”, “No”, “Activado”, “Desactivado” que representan valores booleanos (y todas las versiones en minúsculas y mayúsculas también deben considerarse) . Tenga en cuenta que el estándar YAML 1.2 eliminó las referencias a estas alternativas.
  • enteros: esto incluye string compuesto únicamente por números. Pero también hexadecimal (0x123) y número octal (0123). Los octales en YAML 1.2 se escriben como 0o123, pero PyYAML no admite esto, sin embargo, es mejor citar ambos. Un número entero especial que PyYAML aún admite, pero de nuevo no en la especificación YAML 1.2, son los sexagesimales: número de base 60 separado por dos puntos (:), indicaciones de tiempo, pero también las direcciones MAC pueden interpretarse como tales si los valores entre/después de los dos puntos están en el rango 00-59
  • flotadores: cuerdas como 1E3 (con signo opcional y mantisa) debe citarse. Por supuesto, 3.14 también debe citarse si es un string. Y los flotantes sexagesimales (con una mantisa después del número después de los dos puntos finales) también deben citarse.
  • marcas de tiempo: 2001-12-15T02:59:43.1Z pero también se deben citar cadenas similares a iso-8601 para evitar que se interpreten como marcas de tiempo
  • Él null el valor se escribe como el vacío stringcomo ~ o Null (en todos los tipos de mayúsculas y minúsculas), por lo que cualquier cadena que coincida con esas debe citarse.

Las citas en lo anterior se pueden hacer con comillas simples o dobles, o se pueden usar escalares plegados o literales de estilo de bloque. Tenga en cuenta que para el estilo de bloque debe usar |- resp. >- para no introducir una nueva línea final que no esté en el original string.

enfrentamientos

YAML asigna un significado especial a ciertos caracteres o combinaciones de caracteres. Algunos de estos solo tienen un significado especial al comienzo de un stringotros sólo dentro de un string.

  • personajes del set !&*?{[ normalmente indican construcciones YAML especiales. Algunos de estos pueden desambiguarse según el siguiente carácter, pero no confiaría en eso.
  • espacio en blanco seguido de # indica un comentario de fin de línea
  • dondequiera que un key es posible (y dentro del modo bloque que se encuentra en muchos lugares) la combinación de dos puntos + espacio (:) indica que seguirá un valor. Si esa combinación es parte de tu escalar stringtienes que citar.

Al igual que con la interpretación errónea, puede usar comillas simples o dobles o escalares plegables o literales de estilo bloque. No puede haber comentarios de final de línea más allá de la primera línea de un escalar de estilo bloque.

PyYAML también puede confundirse con cualquier dos puntos + espacio dentro de un escalar simple (incluso cuando se trata de un valor), así que siempre cítelos.

Representación de caracteres especiales

Puede insertar caracteres especiales o puntos de código Unicode en un archivo YAML, pero si desea que estos sean claramente visibles en todos los casos, es posible que desee utilizar secuencias de escape. En ese caso, debe usar comillas dobles, este es el único modo que permite escapes de barra invertida. Y por ejemplo u2029. Se puede tomar una lista completa de tales escapes del estándar, pero tenga en cuenta que PyYAML no implementa, por ejemplo / (o al menos no lo hice cuando bifurqué esa biblioteca).


Un truco para averiguar qué citar o no es usar la biblioteca utilizada para volcar las cadenas que tiene. Mi ruamel.yaml y PyYAML utilizados por docker-compose, cuando potencialmente descargan un escalar simple, ambos intentan leer (sí, analizando el resultado) la representación escalar simple de un string y si eso resulta en algo diferente a un string, es claro que se deben aplicar comillas. También puede hacerlo: en caso de duda, escriba un pequeño programa que descargue la lista de cadenas que tiene usando PyYAML safe_dump() y aplicar comillas en cualquier lugar donde lo haga PyYAML.

Te mostramos las reseñas y valoraciones de los lectores

Si sostienes algún reparo o capacidad de aumentar nuestro enunciado puedes realizar una referencia y con mucho placer lo interpretaremos.

¡Haz clic para puntuar esta entrada!
(Votos: 0 Promedio: 0)



Utiliza Nuestro Buscador

Deja una respuesta

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *