Docker yürütme / çalıştırma kabuk komutu iç içe yerleştirme


15

Kullanım senaryosuna kısa bir giriş:

Testlerimi kullanarak bir dockerkap gokullanıyorum go test ./.... Bu kullanılarak kolayca elde edilebilir docker exec <container> /bin/sh -c "go test ./...". Ne yazık ki go test ./...tüm alt dizinlerde çalışır ve bir (satıcı dizini) hariç tutmak istiyorum.

Bunun için önerilen çözüm aşağıdaki komutu kullanmaktır: bir go test $(go list ./... | grep -v '<excluded>'şekilde bu beni aşağıdaki sonuca bırakıyor:

docker run golang:1.6.2-alpine /bin/sh -c "go test " (Bunu hem çalışma hem de exec'de test ettim, ancak muhtemelen aynı çekirdeği kullanıyorlar).

Ben docker exec -it <container_id> /bin/shaynı komutu kullanarak konteyner çalıştırmak ssh zaman , bir cazibe gibi çalışır.

Docker exec / run ile kabuk komutları yürütmek iç içe geçmiş komutları desteklemiyor gibi görünüyor $()?


Tam olarak hangi komutu verdiniz? İçinde $(go list ./... | grep -v '<excluded>'ne var <excluded>?
cuonglm

vendorÖrneğin bir dizin .
Wesley van Opdorp

4
Tamam, bu yüzden $(...)kabuk tarafından docker kapsayıcısında çalıştırılmadan önce çift tırnak içinde genişletildiğini unutmayın . Bu nedenle, sorun geçerli dizin içeriğinizden kaynaklanıyor olabilir. Çalıştı mı docker exec container /bin/sh -c 'go test $(go list ./... | grep -v "<excluded>")'?
cuonglm

Komutları bir komut dosyasından neden çalıştırmıyorsunuz ?
030

Yanıtlar:


30

Ortak bir bash gotcha sayesinde komutunuz beklediğiniz gibi çalışmıyor olabilir:

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

Çalıştırmaya çalıştığınız komut $(), çift tırnak içinde olduğu için ana makinenizdeki alt kabuğun genişlemesini gerçekleştirir .

Bu, soru yorumlarında @cuonglm tarafından önerildiği gibi, komutunuzu tek bir tırnakla çözerek çözülebilir.

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

DÜZENLEME: Küçük bir 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

Gönderen go test --help:

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

Yani sanırım go test -run "(!vendor)" ./...o klasörü atlayacak gibi bir şey .


Teşekkürler Marcel, bu işe yarıyor! Ne yazık ki, hiçbir testle eşleşmediği tüm dizinleri listeler - tüm satıcı dizinini "test dosyası yok" ile listeler.
Wesley van Opdorp

Bunları her zaman filtreleyebilirsiniz:$(go test -run "(!vendor)" ./... | egrep -v "no test files\|vendor")
Marcel
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.