Hacktoberfest 2026: los issues que los mantenedores marcaron para octubre, abiertos y aptos para principiantes. Explorar issues de Hacktoberfest

docker stack: text after an unbraced `$VAR` is dropped when it starts with `-`, `:-`, `?` or `:?`

Abierto Apto para principiantes
#7,422 0 comentarios 0 reacciones 0 asignados Ver en GitHub

Los mantenedores suelen responder en 1 día

@sebxt ya está trabajando en esto.

Desde el 20/10/2026.

  • #7423 de @sebxt — abierto

Evaluación

Dificultad
2/5
Tiempo estimado
1-3 horas
Aptitud para principiantes
87/100
Tipo de issue
Error
Claridad
Bien especificado
Estado de actividad
Activo
Stack tecnológico
docker, go
Área
cli

Línea de trabajo

Empieza en cli/compose/template/template.go e inspecciona defaultPattern, especialmente cómo los grupos named y braced usan el patrón de sustitución. Reproduce el problema con el archivo compose proporcionado y docker stack config; después, compara la salida esperada con docker compose config. Se considera terminado cuando el texto después de las variables sin llaves permanece literal, mientras que los modificadores entre llaves siguen funcionando.

Escrito por el modelo de indexación a partir del texto del issue.

Descripción

Description

In compose files used with docker stack config and docker stack deploy, an unbraced variable that is followed by -, :-, ? or :? is parsed as if it were the braced form with a modifier. The text after the variable is consumed as a default value or an error message.

For example nginx:$NGINX_VERSION-alpine is treated like nginx:${NGINX_VERSION-alpine}, and http://localhost:$PORT?ready=1 like http://localhost:${PORT?ready=1}.

The compose specification, docker compose, and shell parameter expansion only support modifiers in the braced form (${VAR:-default}); for $VAR the following characters are literal.

Reproduce

# c.yml
version: "3.8"
services:
  web:
    image: "nginx:$NGINX_VERSION-alpine"
    healthcheck:
      test: ["CMD", "wget", "-q", "http://localhost:$PORT?ready=1"]
$ NGINX_VERSION=1.27 PORT=8080 docker stack config -c c.yml
version: "3.8"
services:
  web:
    healthcheck:
      test:
        - CMD
        - wget
        - -q
        - http://localhost:8080
    image: nginx:1.27

With PORT unset, the command fails with required variable PORT is missing a value: ready=1.

Expected behavior

$ NGINX_VERSION=1.27 PORT=8080 docker stack config -c c.yml
...
        - http://localhost:8080?ready=1
    image: nginx:1.27-alpine

This is what docker compose config prints for the same file.

Root cause

In cli/compose/template/template.go the named group of defaultPattern uses the same sub-pattern as the braced group:

subst = "[_a-z][_a-z0-9]*(?::?[-?][^}]*)?"
...
"%s(?i:(?P<escaped>%s)|(?P<named>%s)|{(?P<braced>%s)}|(?P<invalid>))",
delimiter, delimiter, subst, subst,

so the optional (?::?[-?][^}]*) modifier suffix also matches after an unbraced name, and everything up to the next } (or the end of the string) is consumed.

Version

master at 52a2671034814f1ec6145aa8238c5fd4f92d5ee7

Lenguaje dominante
Go
Estrellas
6.1k
Forks
2.2k
Merge medio
15 h 11 min
PR fusionados (30 d)
42

Preparar el entorno

Primeros pasos

  1. Lee el issue completo y luego la guía de contribución del proyecto.
  2. Comenta en el issue que vas a ocuparte — evita que dos personas hagan lo mismo.
  3. Haz un fork del repositorio y trabaja en una rama.
  4. Abre un pull request que haga referencia al número del issue.

Más de docker/cli

Todos los issues de docker/cli

Issues similares

Más issues de Go

Recibe los nuevos issues en tu correo

Un resumen breve de issues de GitHub para principiantes.