14Room

みんな泣きながらオトナになったんだ。

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"

単純にダブルクォートで囲んだだけでは上手く行かないところが落とし穴ですね。

参考にしたページ

docs.docker.com