为什么bash脚本的工作取决于终端窗口的大小?

时间:2017-03-01 08:10:55

标签: bash docker

我知道这听起来很奇怪,但事情就是这样。我有一个docker容器,它托管一个数据库。我有一个脚本,试图逐个执行一个补丁。现在,脚本不知道数据库端口(因为每次容器绑定到不同的端口)。所以这是脚本的开头:

#!bin/bash

echo "Calculating the port..."
port=$(docker-compose ps | grep database-docker | sed  "s/.*://g" | sed "s/\-.*//")
echo "Port is $port"

基本上它应该对docker-compose ps的输出作出反应,输出如下内容:

     Name                       Command             State            Ports          
wildfly_database-docker_1   docker-entrypoint.sh mysqld   Up      0.0.0.0:32768->3306/tcp

但是,事情就是这样。如果我的终端窗口很小,则此脚本不起作用,端口变量为空。如果我全屏扩展终端窗口,它工作正常,并做我需要的。我想这是因为第一种情况下的输出在几行中被打破,并且无法正确解析。

那么,如何使bash脚本独立于窗口大小工作?

UPD 即可。由于评论,我找到了解决方案。看起来这是一个docker-compose的问题。但在我将其更改为此行之后

port=$(docker ps | grep database-docker | sed  "s/.*://g" | sed "s/\-.*//") 

一切正常。 Docker本身不受终端大小的影响。

3 个答案:

答案 0 :(得分:2)

由于评论,我找到了解决方案。看起来这是一个docker-compose的问题。但在我将其更改为此行之后

port=$(docker ps | grep database-docker | sed  "s/.*://g" | sed "s/\-.*//") 

一切正常。 Docker本身不受终端大小的影响。

答案 1 :(得分:0)

docker ps有一个选项--no-trunc,以避免让它过于宽泛地输出,但如果你不是首先产生宽输出,那么它就没有必要。

通过简单地使用内置工具打印机器可读输出来避免useless grep等。

docker ps --filter "name=database-docker" --format '{{.Ports}}' |
sed 's/.*:\([1-9][0-9]*\)->.*/\1/'

有关详细信息,请参阅the fine documentation。正确理解--format选项还需要Go template文档。我想应该可以使用它来删除剩余的sed片段,但我无法学到足够的东西去实际做到这一点。

Docker cheat sheet具有以下公式:

docker inspect -f '{{range $p, $conf := .NetworkSettings.Ports}} {{$p}} -> {{(index $conf 0).HostPort}} {{end}}'

但是,我收到以下错误消息:

Template parsing error: template: :1:37: executing "" at <.NetworkSettings.Por...>: map has no entry for key "NetworkSettings"

答案 2 :(得分:0)

根据您的要求,我建议您将命令更改为:

port=$(docker-compose port database-docker 3306 | sed 's/.*://')

docker port和相关docker-compose port命令用于返回所选容器/服务的请求发布端口和内部端口号。