繁体   English   中英

在BASH变量中存储`docker run`命令输出

[英]Store `docker run` command output in BASH variable

我有一个问题,在BASH varibale中存储docker run -it -d -p 43211:3000 --name appname -h hostname -v $PWD/local_dir:/root/remote_dir repo/imagename的输出。 我试过`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,成功运行应用程序,但不幸的是,这只解决了我面临的问题的一半。

任何帮助,将不胜感激。

谢谢!

您需要的是捕获标准错误并将其存储在变量中。

运用

BASH_VAR=$(command)

要么

BASH_VAR=`command`

将捕获标准输出而不是标准错误。

这是在标准错误消息中存储标准错误消息的正确语法:

BASH_VAR=$( { command; } 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.

你可能需要打破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"

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM