在 shell 脚本中执行时 Docker Kill 不起作用

use*_*776 0 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
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 脚本中工作?

Mat*_*att 5

如果使用set -e该脚本,则任何命令失败时都会退出。即当命令返回代码 != 0 时。这意味着如果您的start,execstop失败,您将留下一个仍然存在的容器。

您可以删除 ,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)