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
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?