【问题标题】:Detect if docker ran successfully within the same script检测 docker 是否在同一个脚本中成功运行
【发布时间】:2019-10-16 16:08:09
【问题描述】:

我的script.sh

#/bin/sh
docker run --name foo 

(假设 docker 命令有效,容器名称为 foo。无法公开实际命令。)

我有一个运行 docker 容器的脚本。我想检查它是否成功运行以及echo终端上的成功运行状态。

如何使用container name 完成此操作?我知道我必须使用 docker inspect 之类的东西,但是当我尝试添加该命令时,它只会在我 ^C 我的脚本之后执行,这可能是因为 docker 执行了。

this 答案中,docker 是在其他一些脚本中执行的,因此它实际上不适用于我的用例。

【问题讨论】:

  • 您希望容器立即退出吗?与任何其他 shell 命令一样,$? 将具有退出状态,0 表示“成功”。

标签: shell docker inspect docker-run


【解决方案1】:

Jules Olléon 的链接答案适用于永久运行的服务,例如网络服务器、应用程序服务器、数据库和类似软件。在您的示例中,您似乎想要按需运行一个容器,该容器旨在完成一些工作然后退出。在这里,状态没有帮助。

如您的示例所示,在前台模式下运行容器时,它会将应用程序返回代码转发到调用 shell。由于您没有发布任何代码,我给您举个简单的例子:我们创建一个 rc.sh 脚本,返回 1 作为退出代码(通常表示失败):

#!/bin/sh
echo "Testscript failed, returning exitcode 1"
exit 1

它在这个Dockerfile中被复制并执行:

FROM alpine:3.7
COPY rc.sh .
ENTRYPOINT [ "sh", "rc.sh" ]

现在我们使用docker build -t rc-test . 构建这个镜像并执行一个短暂的容器:

$ docker run --rm rc-test
Testscript failed, returning exitcode 1

Bash 在$? 中给我们返回码:

$ echo $?
1

所以我们看到容器失败了,可以简单地check them e.g. inside some bash script with an if-condition 在失败时执行一些操作:

#!/bin/bash

if ! docker run --rm rc-test; then
    echo "Docker container failed with rc $?"
fi

【讨论】:

  • 我最初尝试过这个并希望它可以工作,但是在运行 ./script.sh 之后没有响应,直到我看到 Running: true 的 ^C 为止。
  • 您是否传递了其他参数或类似参数?我的示例中的代码使用一个简单的 bash 脚本进行了测试,该脚本在容器的 ENTRYPOINT 中执行。
【解决方案2】:

运行docker run 命令后,您可以通过这种方式检查您的 docker 容器是否仍在运行:

s='^foo$'

status=$(docker ps -qf "name=$s" --format='{{.Status}}')
[[ -n $status ]] && echo "Running: $status" || echo "not running"

【讨论】:

  • 我最初尝试过这个并希望它可以工作,但是在运行 ./script.sh 之后没有响应,直到我看到 ^C 时看到 Running: true
  • 更快的方法:[[ "$(docker ps -aq -f status=running -f name=$s)" == "" ]] && echo "not running" || echo "Running"
【解决方案3】:

您只需要使用“-d”执行它即可以分离模式执行容器。有了这个,其他帖子中提供的解决方案或@anubhava提供的解决方案都是很好的解决方案。

docker run -d -name some_name mycontainer
s='^some_name$'
status=$(docker ps -qf "name=$s" --format='{{.Status}}')
[[ -n $status ]] && echo "Running: $status" || echo "not running"

【讨论】:

  • 我最初尝试过这个并希望它能够工作,但是在运行 ./script.sh 之后没有响应,直到我看到 Running: true 的 ^C 为止。
猜你喜欢
  • 2021-12-19
  • 1970-01-01
  • 2015-01-04
  • 1970-01-01
  • 1970-01-01
  • 2019-03-21
  • 2021-10-23
  • 2017-03-21
  • 2020-09-23
相关资源
最近更新 更多