在终端中逐行手动运行命令时,以下工作正常:
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脚本中使其工作?
答案 0 :(得分:4)
如果使用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
实际上非常有用,可以捕获大多数脚本中默认忽略的许多问题。一个稍微复杂的解决方案是use a trap在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 || 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=$?