当在shell脚本中执行时,Docker kill不起作用

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

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脚本内工作?

如果使用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实际上是相当有用的,并且捕获了大多数在大多数脚本中被忽略的问题。 稍微复杂一点的解决方法是使用陷阱来执行EXIT上的清理步骤,这意味着可以使用set -e

 #!/usr/bin/env bash set -e # Set a default return code RC=2 # Cleanup function cleanup { echo "Removing container" (docker stop test) (docker rm -f test) 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=$?