Bash脚本进入正在运行的容器,然后从该容器运行另一个bash脚本

时间:2015-11-26 23:32:26

标签: bash postgresql shell docker dockerfile

我有一个shell脚本,运行如下:

image_id=$(docker ps -a | grep postgres | awk -F' ' '{print $1}')
full_id=$(docker ps -a --no-trunc -q | grep $image_id)
docker exec -i -t $full_id bash

当我从基础Linux操作系统运行时,我希望实际进入postgres容器,这是一个正在运行的容器。但问题是shell脚本在'docker exec'步骤期间挂起在第3行。

我的最终目标是使用bash脚本,输入一个正在运行的postgres容器并在该容器中运行另一个bash脚本。 但是当我从命令行运行它时,同样的命令,它工作正常,让我进入postgres容器。

请帮忙,我花了好几个小时来解决这个问题但没有进展。

再次感谢

1 个答案:

答案 0 :(得分:2)

您的设置比需要的设置复杂一点。

Docker ps可以使用--filter=选项直接过滤容器

docker ps --no-trunc --quiet --filter="ancestor=postgres"

您运行它们时也可以--name个容器,这些容器的危险性要小于您尝试的脚本

docker run --detach --name postgres_whatever postgres
docker exec -ti postgres_whatever bash

我不确定你的脚本是否悬空而不是坐在那里等待输入。尝试直接运行命令

使用命名

exec_test.sh

#!/usr/bin/env bash
docker exec postgres_whatever echo "I have run the test"

运行时

$ ./exec_test.sh
I have run the test

没有命名

exec_filter_test.sh

#!/usr/bin/env bash
id=$(docker ps --no-trunc --quiet --filter="ancestor=postgres")
[ -z "$id" ] && echo "no id" && exit 1
docker exec "${id}" echo "I have run the test"

运行时

$ ./exec_filter_test.sh 
I have run the test