gpt4 book ai didi

while-loop - 从 docker-compose breaking while 循环中退出代码

转载 作者:行者123 更新时间:2023-12-05 05:15:20 25 4
gpt4 key购买 nike

我有一个案例:有一个 WordPress 项目,我应该在其中创建一个脚本来更新插件并将源更改提交到分离的分支。在执行此操作时,我遇到了一个奇怪的问题。

输入变量:

    akimset,4.0.3
all-in-one-wp-migration,6.71

我想做的是迭代这个变量的每一行

    while read -r line; do
echo $line
done <<< "$variable"

这段代码工作得很好,但是当我添加 docker-compose 逻辑时,一切都开始变得奇怪了

    while read -r line; do
docker-compose run backend echo $line
done <<< "$variable"

现在只执行了一行,此脚本以 0 退出并停止迭代。我找到了解决方法:

    echo $variable > file.tmp
for line in $(cat file.tmp); do
docker-compose run backend echo $line
done

而且它工作得非常好,它会迭代每一行。现在我的问题是:为什么? ZSH 和 shell 脚本可能有点神秘,在像这样的边缘情况下运行对我来说并不是什么新鲜事,但我想知道为什么成功执行的脚本会破坏输入流。

最佳答案

这个问题

while read -r line; do
docker-compose run backend echo $line
done <<< "$variable"

是docker allocate伪TTY。在第一次执行 docker-compose run(第一个循环)后,它使用下一行作为输入访问终端。

您必须将 -T 参数传递给“docker-compose run”命令,以避免 docker 分配伪 TTY。然后,一个工作代码是:

while read -r line; do
docker-compose run -T backend echo $line
done < $(variable)

更新

以上解决方案适用于 docker 版本 18 和 docker-compose 版本 1.17。对于较新的版本,参数 -T 不起作用,但您可以尝试:

  1. -d 而不是 -T 以后台模式运行容器,但不,您不会在终端中看到标准输出。
  2. 如果您有 docker-compose v1.25.0,请在您的 docker-compose.yml 中为服务添加参数 stdin_open: false。

关于while-loop - 从 docker-compose breaking while 循环中退出代码,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/51616789/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com