Docker exec / run shell annidamento comandi


15

Una breve introduzione al caso d'uso:

Sto usando un dockercontenitore per eseguire i miei gotest usando go test ./.... Questo può essere ottenuto facilmente usando docker exec <container> /bin/sh -c "go test ./...". Sfortunatamente si go test ./...estende su tutte le sottodirectory e vorrei escluderne una (la directory del fornitore).

La soluzione consigliata per questo sta usando il seguente comando go test $(go list ./... | grep -v '<excluded>':, in qualche modo questo mi lascia con il seguente risultato:

docker run golang:1.6.2-alpine /bin/sh -c "go test " (Ho provato questo sia su run che su exec, ma probabilmente usano lo stesso core).

Quando utilizzo il contenitore usando docker exec -it <container_id> /bin/shed eseguo esattamente lo stesso comando, funziona come un incantesimo.

Sembra che l'esecuzione dei comandi shell tramite la finestra mobile exec / run non supporti alcun comando nidificato con $()?


Quale comando hai eseguito esattamente? In $(go list ./... | grep -v '<excluded>', che cos'è <excluded>?
cuonglm,

È una directory, vendorper esempio.
Wesley van Opdorp,

4
OK, quindi nota che è $(...)stato espanso dalla tua shell tra virgolette doppie prima che fosse eseguito all'interno del contenitore docker. Pertanto, il problema potrebbe derivare dal contenuto della directory corrente. Ha docker exec container /bin/sh -c 'go test $(go list ./... | grep -v "<excluded>")'funzionato?
cuonglm,

Perché non eseguire i comandi da uno script ?
030

Risposte:


30

Il tuo comando potrebbe non funzionare come previsto grazie a un bash gotcha comune:

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

Il comando che si sta tentando di eseguire eseguirà l'espansione della subshell $()sull'host perché è racchiusa tra virgolette doppie.

Questo può essere risolto citando semplicemente il tuo comando come suggerito da @cuonglm nei commenti alla domanda.

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

EDIT: una piccola demo

[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

0

Da go test --help:

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

Quindi immagino che qualcosa del genere go test -run "(!vendor)" ./...salti quella particolare cartella.


Grazie Marcel, questo funziona! Sfortunatamente elenca tutte le directory in cui non corrisponde a nessun test, elencando l'intera directory del fornitore con "nessun file di test".
Wesley van Opdorp,

Bene, puoi sempre filtrare quelli:$(go test -run "(!vendor)" ./... | egrep -v "no test files\|vendor")
Marcel il
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.