当在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。这意味着如果你的start
, exec
或stop
失败,你将留下一个容器在那里。
您可以删除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=$?