我在将docker run -it -d -p 43211:3000 --name appname -h hostname -v $PWD/local_dir:/root/remote_dir repo/imagename
的输出存储在BASH varibale中时遇到问题。我试过`backticks`,我也尝试像官方文档说BASH_VAR=$(docker run ...)
那样运行它,我甚至尝试将输出存储在docker run --...>$FILE_DESCRIPTOR
的文件中,但没有运气存储错误的情况,当name已被另一个容器使用,如下所示:
$ 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中,但不幸的是,这只解决了我的问题的一半面对。
任何帮助将不胜感激。
谢谢!
答案 0 :(得分:2)
您需要捕获标准错误并将其存储在变量中。
使用
BASH_VAR=$(command)
或
BASH_VAR=`command`
将捕获标准输出而不是标准错误。
这是将标准错误消息存储在变量中的正确语法:
BASH_VAR=$( { command; } 2>&1 )
答案 1 :(得分:0)
您可能需要打破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"
答案 2 :(得分:-1)
您可以使用while循环来读取生成的每一行输出,并以这种方式执行某些操作。
while read -r line_of_output; do
echo "line: $line_of_output"
done < <(docker ... 2>&1)
另外,如果您正在编写交互式脚本,则可能需要查看select
bash builtin
$ help select
select: select NAME [in WORDS ... ;] do COMMANDS; done
Select words from a list and execute commands.