在shell脚本中执行时,Docker kill无效

时间:2016-08-04 14:32:19

标签: bash shell docker

在终端中逐行手动运行命令时,以下工作正常:

docker create -it --name test path
docker start test
docker exec test /bin/sh -c "go test ./..."
docker stop test
docker rm -test

但是当我将它作为shell脚本运行时,Docker容器既不会停止也不会被删除。

#!/usr/bin/env bash
set -e

docker create -it --name test path
docker start test
docker exec test /bin/sh -c "go test ./..."
docker stop test
docker rm -test

如何在shell脚本中使其工作?

1 个答案:

答案 0 :(得分:4)

如果使用set -e,则任何命令失败时脚本都将退出。即当一个命令返回代码!= 0.这意味着如果你的startexecstop失败,你将留下一个容器。

您可以删除set -e,但您可能仍希望使用go test命令的返回码作为整体返回码。

#!/usr/bin/env bash

docker create -it --name test path
docker start test
docker exec test /bin/sh -c "go test ./..."
rc=$?
docker stop test
docker rm test
exit $rc

陷阱

使用set -e实际上非常有用,可以捕获大多数脚本中默认忽略的许多问题。一个稍微复杂的解决方案是use a trapEXIT上运行您的清理步骤,这意味着可以使用set -e

#!/usr/bin/env bash
set -e

# Set a default return code
RC=2

# Cleanup
function cleanup {
  echo "Removing container"
  docker stop test || true
  docker rm -f test || true
  exit $RC
}
trap cleanup EXIT

# Test steps
docker create -it --name test path
docker start test
docker exec test /bin/sh -c "go test ./..."
RC=$?