Docker exec / run shell shell lồng


15

Giới thiệu ngắn về trường hợp sử dụng:

Tôi đang sử dụng một dockercontainer để chạy gothử nghiệm của tôi bằng cách sử dụng go test ./.... Điều này có thể dễ dàng đạt được bằng cách sử dụng docker exec <container> /bin/sh -c "go test ./...". Thật không may go test ./...chạy trên tất cả các thư mục con và tôi muốn loại trừ một (thư mục nhà cung cấp).

Giải pháp được khuyên cho việc này là sử dụng lệnh sau : go test $(go list ./... | grep -v '<excluded>', bằng cách nào đó, điều này cho tôi kết quả như sau:

docker run golang:1.6.2-alpine /bin/sh -c "go test " (Tôi đã thử nghiệm điều này trên cả chạy và thực thi, nhưng có lẽ chúng sử dụng cùng một lõi).

Khi tôi ssh vào container bằng cách sử dụng docker exec -it <container_id> /bin/shvà chạy cùng một lệnh chính xác, nó hoạt động như một bùa mê.

Có vẻ như việc thực thi các lệnh shell qua docker exec / run không hỗ trợ bất kỳ lệnh nào được lồng vào $()?


Chính xác lệnh nào bạn đã chạy? Trong $(go list ./... | grep -v '<excluded>', là những gì <excluded>là?
cuonglm

Đó là một thư mục, vendorví dụ.
Wesley van Opdorp

4
OK, vì vậy lưu ý rằng $(...)đã được mở rộng bởi shell của bạn bên trong dấu ngoặc kép trước khi nó được chạy bên trong container docker. Vì vậy, vấn đề có thể đến từ nội dung thư mục hiện tại của bạn. Đã docker exec container /bin/sh -c 'go test $(go list ./... | grep -v "<excluded>")'làm việc chưa?
cuonglm

Tại sao không chạy các lệnh từ một kịch bản ?
030

Câu trả lời:


30

Lệnh của bạn có thể không hoạt động như bạn mong đợi nhờ một bash gotcha thông thường:

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

Lệnh bạn đang cố chạy sẽ thực hiện việc mở rộng lớp con $()trên máy chủ của bạn vì nó nằm trong dấu ngoặc kép.

Điều này có thể được giải quyết bằng cách trích dẫn lệnh của bạn theo đề xuất của @cuonglm trong phần bình luận câu hỏi.

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

EDIT: Một bản demo nhỏ

[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

Từ go test --help:

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

Vì vậy, tôi đoán một cái gì đó như go test -run "(!vendor)" ./...sẽ bỏ qua thư mục cụ thể.


Cảm ơn Marcel, điều này hoạt động! Thật không may, nó liệt kê tất cả các thư mục trong đó nó không khớp với bất kỳ kiểm tra nào - liệt kê toàn bộ thư mục nhà cung cấp với "không có tệp kiểm tra".
Wesley van Opdorp

Chà, bạn luôn có thể lọc những thứ đó:$(go test -run "(!vendor)" ./... | egrep -v "no test files\|vendor")
Marcel
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.