Docker exec / jalankan perintah shell bersarang

Pengantar singkat untuk kasus penggunaan:

Saya menggunakan docker wadah untuk menjalankan saya go tes menggunakan go test ./.... Ini dapat dicapai dengan mudah menggunakan docker exec <container> /bin/sh -c "go test ./...". Sayangnya go test ./... berjalan di semua subdirektori dan saya ingin mengecualikan satu (direktori vendor).

Solusi yang disarankan untuk ini adalah menggunakan perintah berikut: go test $(go list ./... | grep -v '<excluded>', entah bagaimana ini meninggalkan saya dengan hasil sebagai berikut:

docker run golang:1.6.2-alpine /bin/sh -c "go test " (Saya telah menguji ini pada run dan exec, tetapi mereka mungkin menggunakan inti yang sama).

Ketika saya ssh ke dalam wadah menggunakan docker exec -it <container_id> /bin/sh dan menjalankan perintah yang sama persis, ia bekerja seperti pesona.

Tampaknya menjalankan perintah shell melalui docker exec / run tidak mendukung perintah apa pun yang bersarang $()?

Perintah Anda mungkin tidak berfungsi seperti yang anda harapkan berkat Bash gotcha yang umum:

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

Perintah yang anda coba jalankan akan melakukan perluasan subkulit $() pada host Anda karena di dalam tanda kutip ganda.

Ini dapat diselesaikan dengan mengutip satu perintah Anda seperti yang disarankan oleh @cuonglm di komentar pertanyaan.

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

EDIT: sedikit 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

Dari go test --help:

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

Jadi saya kira sesuatu seperti go test -run "(!vendor)" ./... akan melewatkan folder tertentu.

OK, jadi perhatikan bahwa’ $(…) 'diperluas oleh shell Anda di dalam tanda kutip ganda sebelum dijalankan di dalam wadah docker. Jadi, masalahnya mungkin berasal dari konten direktori Anda saat ini. Apakah ‘docker Exec kontainer / tempat sampah / sh-c’ pergi uji $(daftar go ./… | grep-v" < dikecualikan>") " bekerja?

Mengapa tidak menjalankan perintah dari skrip?

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

Ini adalah direktori ` ‘vendor’ misalnya.