Dockerはコンテナ単位で環境を用意し docker exec や docker run というコマンドで実行中のコンテナや新しいコンテナの中でコマンドを実行させられます。これは次の様にできます。
docker run イメージ名 [コマンド] docker exec コンテナ名 コマンド
実際に動かす際にはイメージやコンテナに定義されたエントリーポイントやらコマンドやらも関わってくるのですが、ここではとりあえずシェルを動かすようになっているとします。docker run イメージ名 Linux上で使える任意のコマンド
としたらそれで動くとかそんな感じです。
前述の前提の上で素直にパイプやリダイレクトを使うと次の様になります。
# pngファイルの情報のみを表示 docker run イメージ名 ls -l | grep png # storage以下のファイル一覧をテキストファイルに書き出し docker exec コンテナ名 find ./storage > storage_files.txt
この時、パイプやリダイレクトの先として実行される部分はホストマシンの上で実行されます。docker run イメージ名 ls -l
まで docker が担い、|
でlsの結果がホスト側のgrep png
に渡される感じです。自分のの場合、その場のコマンドの結果をその場で使いたいだけのことが多いのでこれでもいいのですが、それでもまれに docker コンテナの中でパイプやリダイレクトも完結させてほしい時があります。そのういったな時は次の様にできます。
# pngファイルの情報のみを表示 docker run イメージ名 sh -c "ls -l | grep png" # storage以下のファイル一覧をテキストファイルに書き出し docker exec コンテナ名 sh -c "find ./storage > storage_files.txt"
このようにsh -c “コマンド”の形式を用いることでコンテナ内でコマンドを完結でき、パイプやリダイレクトの宛先をホストマシンからコンテナに変えられます。
ホストマシンに入っていないがコンテナ内にあるコマンドでパイプやリダイレクト先の処理をしたい、コマンド実行結果をDockerコンテナ内に残しておきたいなどする時にこれを知っておくと便利です。