docker execでパイプ「|」を含んだコマンドを実行させたい。
題名のままなのですが、docker execでパイプ「|」を含んだコマンドを実行させたい状況が発生しました。
例えばdockerで動くpostgresに対して、下記のようなコマンドでデータをリストアしようとした場合です。
docker exec postgres_container gunzip -c backup.gz | psql -U postgres mydb
しかし、このまま実行すると、パイプから後のコマンド( psql -U postgres mydb
) はコンテナ内のコマンドではなく、dockerが動いてるホストマシン上のコマンドと認識されてしまい、意図した通りに動きません。
そこで、こんな時は下記のようにsh -c を使うとうまくいきます。
docker exec postgres_container sh -c "gunzip -c backup.gz | psql -U postgres mydb"
単純にダブルクォートで囲んだだけでは上手く行かないところが落とし穴ですね。
参考にしたページ