web-dev-qa-db-ja.com

Bash / Docker exec:コンテナー内からのファイルリダイレクト

Dockerコンテナーからファイルのコンテンツを読み取る方法がわかりません。 SQLファイルのコンテンツをPGSQLコンテナに実行したい。私は試した:

docker exec -it app_pgsql psql --Host=127.0.0.1 --username=foo foo < /usr/src/app/migrations/*.sql

私のアプリケーションは/usr/src/app。しかし、エラーが発生しました:

bash:/usr/src/app/migrations/*.sql:そのようなファイルまたはディレクトリはありません

Bashはこのパスをゲストパスではなくホストパスとして解釈しているようです。実際、コマンドを2回実行すると完全に機能します。

docker exec -it app_pgsql
psql --Host=127.0.0.1 --username=foo foo < /usr/src/app/migrations/*.sql

これはDockerの問題というよりもBashの問題だと思いますが、私はまだ立ち往生しています! :)

27

シェルを使用してコマンドを実行してみてください

sh -c 'psql --Host=127.0.0.1 --username=foo foo < /usr/src/app/migrations/*.sql'

完全なコマンドは次のとおりです。

docker exec -it app_pgsql sh -c 'psql --Host=127.0.0.1 --username=foo foo < /usr/src/app/migrations/*.sql'
33
VonC

sh -c "your long command"

14
user2915097

データベースクライアントを使用してコンテナに接続し、データベースファイルをリダイレクトしてから、復元を実行できます。

MySQLの例:ホストネットワークスタックを使用してMySQLを実行するコンテナ。コンテナはホストネットワークスタックを使用しているため(MySQLまたはデータベースに制限がない場合)、localhost経由で接続し、コマンドを透過的に実行できます。

mysql -h 127.0.0.1 -u user -pyour_passwd database_name < db_backup.sql

PostgresSQLでも同じことができますコマンドラインを使用してpostgresバックアップファイルを復元しますか? ):

pg_restore --Host 127.0.0.1 --port 5432 --username "postgres" --dbname "mydatabase" --no-password --clean "/home/dinesh/db/mydb.backup"

「docker exec」は入力リダイレクトをサポートしていないようです。これを確認し、該当する場合はGitHubでDockerコミュニティの問題を公開する可能性があります。

1
ivanleoncz