【Docker】docker run や docker exec でパイプやリダイレクトの先もコンテナ内で実行させる方法

 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コンテナ内に残しておきたいなどする時にこれを知っておくと便利です。

>株式会社シーポイントラボ

株式会社シーポイントラボ

TEL:053-543-9889
営業時間:9:00~18:00(月〜金)
住所:〒432-8003
   静岡県浜松市中央区和地山3-1-7
   浜松イノベーションキューブ 315
※ご来社の際はインターホンで「316」をお呼びください

CTR IMG