如何在Bash中检查Docker实例是否正在运行

3

使用docker ps -a命令

CONTAINER ID        IMAGE                         COMMAND                  CREATED             STATUS                    PORTS                    NAMES

56489a32cb8c        83132b61eccf                  "bash"                   41 hours ago        Exited (0) 41 hours ago                            naughty_jang
4b4933b40175        83119b65eccf                  "bash"                   41 hours ago        Exited (0) 41 hours ago                            suspicious_mcnulty
3149e612f9f8        83119b6143cf                  "sh"                     43 hours ago        Exited (0) 41 hours ago                            thirsty_mestorf

我希望匹配 STATUSNAMES 列以检查实例状态,因此应从索引1开始使用第5列和第7列。

假设有制表符分隔的值。

docker ps -a | awk -FS $'\t' '{print $5,$7}'

或者
docker ps -a | awk 'BEGIN {FS="\t"}; {print $5,$7}'

但是如果保留默认的空格字符FS,这种方法将不起作用。
docker ps -a | awk 'BEGIN {FS=" "}; {print $5,$7}'

所以我尝试逐列匹配,例如

awk -F$" " -v COLT=$1 '
        NR==1 {
                for (i=1; i<=NF; i++) {
                        if ($i==COLT) {
                                title=i;
                        }
                }
        }
        NR>1 {
                if (i=title) {
                        print $i
                }
        }
'

你需要在脚本中添加这段代码

docker ps -a | ./status.sh NAMES

但由于制表符不匹配,因此这将无法工作。问题在于docker ps -a的输出具有空格而不是制表符,因此变量数量的空格,因此我应该使用特定的正则表达式作为FS字段分隔符,如此处所述,但我无法弄清楚如何做到这一点。


你不需要指定选项卡,只需到达所需的列即可。 - Maroun
NAMES 可以是随机生成的或固定的,因此我想匹配所有名称,而 STATUS 列类似于 [a-Z]+ (\d) (\d\d 小时前)(仅为简化...)或 Created 等。 - loretoparisi
@loretoparisi:我可以问一下你对输入的实际期望输出吗?上面的评论有误导性。 - Inian
@Inian 是的,这是每一行的“NAMES”和“STATUS”列的值,就像问题中展示的docker ps -a命令的输出。 - loretoparisi
1
如果您只想获取特定容器的状态,可以使用 docker inspect -f "{{.State.Status}}" container-name - Henry
@Henry 谢谢你,我刚才在下面得到了答案,不知道有这种格式选项。 - loretoparisi
1个回答

3

使用简单的docker ps --format "{{.ID}} {{.Command}} {{.Status}}"命令更容易解析,因为它只有三列。

通过格式化,你只能显示你需要的最少信息,并且可以在每个列之间设置所需的分隔符。

OP loretoparisi建议在评论中使用。

docker ps -a --format "{{.ID}}\t\"{{.Status}}\"\t{{.Names}}" | cut -f2 -d$'\t' 

要获取第二列,或者你可以这样做:
docker ps -a --format "{{.ID}}\t\"{{.Status}}\"\t{{.Names}}" | awk -F$"\t" '{printf "%s|%s|%s\n", $1, $2, $3}' 

统治所有IT技术领域!


这个命令是像这样的 docker ps -a --format "{{.ID}}\t\"{{.Status}}\"\t{{.Names}}" - loretoparisi
@loretoparisi 如果你想用制表符进行切割:http://unix.stackexchange.com/a/35370/7490 - VonC
是的!这就像:docker ps -a --format "{{.ID}}\t\"{{.Status}}\"\t{{.Names}}" | cut -f2 -d$'\t' 获取第二列,或者你可以使用 docker ps -a --format "{{.ID}}\t\"{{.Status}}\"\t{{.Names}}" | awk -F$"\t" '{printf "%s|%s|%s\n", $1, $2, $3}' 来统治它们所有! - loretoparisi
1
@loretoparisi 做得好。我已经将您的评论包含在答案中,以增加可见性。 - VonC

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接