web-dev-qa-db-ja.com

Docker exec / run Shellコマンドのネスト

ユースケースの簡単な紹介:

_go test ./..._を使用してdockerコンテナーを使用してgoテストを実行しています。これは、_docker exec <container> /bin/sh -c "go test ./..."_を使用して簡単に実現できます。残念ながら、_go test ./..._はすべてのサブディレクトリにわたって実行されており、1つ(ベンダーディレクトリ)を除外したいと思います。

これに対する推奨される解決策は、次のコマンドを使用することです:_go test $(go list ./... | grep -v '<excluded>'_、どういうわけかこれは私に次の結果を残す:

_docker run golang:1.6.2-Alpine /bin/sh -c "go test "_(私はこれを実行と実行の両方でテストしましたが、おそらく同じコアを使用しています)。

_docker exec -it <container_id> /bin/sh_を使用してコンテナーにsshし、まったく同じコマンドを実行すると、チャームのように動作します。

Docker exec/runを介したシェルコマンドの実行は、$()でネストされたコマンドをサポートしていないようです。

16

一般的なbashの問題により、コマンドが期待どおりに機能しない可能性があります。

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

実行しようとしているコマンドは、二重引用符で囲まれているため、ホストでサブシェル$()の展開を実行します。

これは、質問のコメントで@cuonglmによって提案されているように、コマンドを単一引用符で囲むことで解決できます。

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

編集:ちょっとしたデモ

_[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
_
31
Will Barnwell

_go test --help_から:

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

したがって、go test -run "(!vendor)" ./...のようなものは、その特定のフォルダをスキップすると思います。

0
Marcel