我有一个案例:有一个 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分配伪TTY。第一次执行 docker-compose run(第一个循环)后,它使用下一行作为输入来访问终端。
您必须将 -T 参数传递给“docker-compose run”命令,以避免 docker 分配伪 TTY。然后,一个工作代码是:
while read -r line; do
docker-compose run -T backend echo $line
done < $(variable)
Update
上述解决方案适用于 docker 版本 18 和 docker-compose 版本 1.17。对于较新版本,参数 -T 不起作用,但您可以尝试:
- -d 而不是 -T 在后台模式下运行容器,但不,您不会在终端中看到标准输出。
- 如果您有 docker-compose v1.25.0,请在 docker-compose.yml 中将参数 stdin_open: false 添加到服务中。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)