在终端中手动逐行运行命令时,以下工作正常:
docker create -it --name test path
docker start test
docker exec test /bin/sh -c "go test ./..."
docker stop test
docker rm -test
Run Code Online (Sandbox Code Playgroud)
但是当我将其作为 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
Run Code Online (Sandbox Code Playgroud)
我怎样才能让它在 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
Run Code Online (Sandbox Code Playgroud)
使用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 || 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=$?
Run Code Online (Sandbox Code Playgroud)