我在将docker run -it -d -p 43211:3000 --name appname -h hostname -v $PWD/local_dir:/root/remote_dir repo/imagename的输出存储在BASH变量中时遇到问题。我试过backticks,我也试着像官方文档上说的BASH_VAR=$(docker run ...)那样运行它,我甚至试着用docker run --...>$FILE_DESCRIPTOR将输出存储在一个文件中,但没有成功地存储错误情况,即名称已被另一个容器使用的情况,如下所示:
$ FATA[0000] Error response from daemon: Conflict. The name "appname" is already in use by container 7c84d8d703c8. You have to delete (or rename) that container to be able to reuse that name.
我想说,它适用于成功的情况,所以在成功运行应用程序时,我能够在BASH_VAR中存储完整的容器ID,但不幸的是,这只解决了我面临的问题的一半。
任何帮助都将不胜感激。
谢谢!
发布于 2019-08-31 00:36:37
您需要的是捕获标准错误并将其存储在一个变量中。
使用
BASH_VAR=$(command)或
BASH_VAR=`command`将捕获标准输出,而不是标准错误。
这是在变量中存储标准错误消息的正确语法:
BASH_VAR=$( { command; } 2>&1 )发布于 2017-12-02 01:57:10
您可以使用while循环在生成输出时读取输出的每一行,并以这种方式对其执行某些操作。
while read -r line_of_output; do
echo "line: $line_of_output"
done < <(docker ... 2>&1)此外,如果您正在编写交互式脚本,则可能需要查看select bash内建
$ help select
select: select NAME [in WORDS ... ;] do COMMANDS; done
Select words from a list and execute commands.发布于 2019-08-31 00:02:53
您可能需要打破while循环,但这是可能的,例如:
MYSQL_IMAGE_NAME='mysql/mysql-server:5.7'
docker pull "$MYSQL_IMAGE_NAME"
docker images
docker run --name=mysql-server-container -d "$MYSQL_IMAGE_NAME"
docker container ls
while read -r line ; do
GENERATED_PWD="$(echo $line | grep 'GENERATED ROOT PASSWORD'|awk '{print $5}')"
test -z $GENERATED_PWD || break
done < <(docker logs --tail 3000 --follow mysql-server-container)
echo "GENERATED_PWD: $GENERATED_PWD"https://stackoverflow.com/questions/29065117
复制相似问题