docker - 执行 docker cmd 后 shell 循环没有完成?
问题描述
我在运行下面的代码时遇到了一个问题:我想在一个目录下有一个循环并在子目录中循环。
cd /mysql_back
ls | while read line
do
echo $line
if [[ -d "$line" ]];then
echo $line
cd $line
ls *.txt | while read datafile
do
echo "start load data:" $datafile
echo "copy ${datafile%.txt} from '/docker-entrypoint-initdb.d/mysql_back/${line}/${datafile}' delimiter ',' csv;" >> add_data.sql
done
docker exec -i $pg_continer psql -U postgres -d $line -f "/docker-entrypoint-initdb.d/mysql_back/${line}/add_data.sql" 2>/dev/null
echo "start next dir"
cd ../
fi
done
cd ${RootPath}
输出:
dstore_notification
dstore_notification
start load data: global.txt
start load data: message.txt
start load data: templet_info.txt
start load data: templet.txt
start next dir
在第一个子目录中完成 docker cmd 后循环结束,
删除 docker cmd 代码后docker exec -i $pg_continer psql -U postgres -d $line -f "/docker-entrypoint-initdb.d/mysql_back/${line}/add_data.sql" 2>/dev/null
输出:
dstore_notification
dstore_notification
start load data: global.txt
start load data: message.txt
start load data: templet_info.txt
start load data: templet.txt
start next dir
dstore_rbac
dstore_rbac
start load data: rbac_admin.txt
start load data: rbac_app_admin_role.txt
start load data: rbac_app_admin.txt
start load data: rbac_app_role.txt
start load data: rbac_service_app.txt
start next dir
我不明白为什么有人可以告诉我为什么会发生这种情况?我应该如何在每个子目录中执行 docker cmd?谢谢!
解决方案
您正在使用 -i 运行 docker exec 命令。这意味着您正在以交互模式运行 exec 命令,终端和 docker 容器等待您自己的输入并提供容器的输出。
要将容器运行到后台,您需要使用 -d 而不是 -i。这也将允许脚本按预期继续。
作为旁注。不要解析 ls 的输出。而是使用“for datafile in *”
推荐阅读
- ios - 以编程方式将默认加密 KMS 添加到存储桶
- azure - 如何使用基于 VSTS 服务器的任务验证消息发布者到服务总线?
- bash - 截断星号获得的变量时抑制壳扩展
- delphi - TBitmap.BitmapScale 属性的用途是什么?
- ionic-framework - Ionic 3 - 在初始屏幕显示期间隐藏状态栏
- azure-ad-b2c - 我希望 azure-ad-b2c 用户以受限访问权限访问我公司的应用程序
- python - 在迭代器上调用 next() 操作两次
- javascript - 如何为弹出框排除 jquery 事件
- javascript - 如何在html中的表格内制作图表?
- vpn - Google IKEv2 DH 密码 modp_2048s256 是否与 Cisco DH 组 24 相同?