首页 > 解决方案 > 执行 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?谢谢!

标签: dockershell

解决方案


您正在使用 -i 运行 docker exec 命令。这意味着您正在以交互模式运行 exec 命令,终端和 docker 容器等待您自己的输入并提供容器的输出。

要将容器运行到后台,您需要使用 -d 而不是 -i。这也将允许脚本按预期继续。

作为旁注。不要解析 ls 的输出。而是使用“for datafile in *”


推荐阅读