我知道这听起来很奇怪,但事情就是这样。我有一个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本身不受终端大小的影响。
答案 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
命令用于返回所选容器/服务的请求发布端口和内部端口号。