Docker exec / ejecutar anidamiento de comandos de shell

Una breve introducción al caso de uso:

Estoy usando un docker contenedor para ejecutar mi go pruebas que utilizan go test ./.... Esto se puede lograr fácilmente usando docker exec <container> /bin/sh -c "go test ./...". Desafortunadamente go test ./... se ejecuta en todos los subdirectorios y me gustaría excluir uno (el directorio de proveedores).

La solución recomendada para esto es usar el siguiente comando: go test $(go list ./... | grep -v '<excluded>', de alguna manera esto me deja con el siguiente resultado:

docker run golang:1.6.2-alpine /bin/sh -c "go test " (He probado esto tanto en run como en exec, pero probablemente usen el mismo núcleo).

Cuando hago ssh en el contenedor usando docker exec -it <container_id> /bin/sh y ejecute exactamente el mismo comando, funciona de maravilla.

Parece que la ejecución de comandos de shell a través de docker exec / run no admite ningún comando anidado con $()?

Es posible que su comando no funcione como esperaba gracias a un error común de bash:

docker exec <container> /bin/sh -c "go test $(go list ./... | grep -v '<excluded>')"

El comando que está intentando ejecutar realizará la expansión de la subcapa $() en su host porque está entre comillas dobles.

Esto se puede resolver citando su comando como lo sugiere @cuonglm en los comentarios de la pregunta.

docker exec <container> /bin/sh -c 'go test $(go list ./... | grep -v "<excluded>")'

EDITAR: Una pequeña demostración

[wbarnwell@host ~]$ docker run -it --rm busybox /bin/sh -c '$(whoami)'/bin/sh: root: not found[wbarnwell@host ~]$ docker run -it --rm busybox /bin/sh -c "$(whoami)"/bin/sh: wbarnwell: not found

De go test --help:

-run regexp     Run only those tests and examples matching the regular                expression.

Así que supongo que algo como go test -run "(!vendor)" ./... saltaría esa carpeta en particular.

OK, así que ten en cuenta que $(...) 'fue expandido por su shell dentro de comillas dobles antes de ejecutarse dentro del contenedor docker. Por lo tanto, el problema puede provenir del contenido de su directorio actual. Hizo docker exec container / bin / sh-c ’ go test $(ir a la lista ./… | grep-v" ") " ¿funciona?

Por qué no ejecutar los comandos desde un script?

What exactly command did you run? In $(go list ./... | grep -v '<excluded>", qué es

Es un directorio, ‘vendor’ por ejemplo.