Docker 运行命令在 bash 脚本中不起作用

Docker 运行命令在 bash 脚本中不起作用

尝试通过 bash 脚本运行 docker 容器。我需要容器在 bash 脚本中启动后立即启动并退出,这样我就可以记录启动容器所花费的时间。图像是一个 tar 文件,使用保存和加载技术从另一台机器复制而来。可以在终端中从图像运行容器,但不能在 shell 脚本中使用 docker run -it imageId 命令运行。它显示错误“docker:守护进程的错误响应:OCI 运行时创建失败:container_linux.go 启动过程导致在 $PATH 中找不到可执行文件:未知。非常感谢您的帮助。谢谢

tl_start=$(date +%s)
docker load>alpine.tar
tl_end$(date +%s)
tl_load=$((tl_end-$tl_start))
image_id=$(docker images -a | awk '$2 ~/none/print{print $3}')
ts_start=$(date +%s)
docker run -i -d alpine:latest $image_id

答案1

看起来您错误地使用了重定向(docker load重定向到的输出alpine.tar):

docker load>alpine.tar

我建议您alpine.tar再次从另一台机器下载(因为它现在可能已损坏)然后使用docker load -i alpine.tar

由于图像加载不正确,这可以解释为什么创建命令失败且$image_id无效。我建议添加一个image_id正确设置的检查。

仅根据何时返回 shell 来测量容器的启动时间docker run并不是真正的启动时间测量。摘自docker run文档:

--detach , -d       Run container in background and print container ID

这意味着它将在后台运行,并且仅仅因为它返回到 shell 并不意味着容器实际上已完全启动并运行。

您还使用$image_id要启动的容器的名称,我猜您想使用刚刚加载的实际映像来启动容器。使用类似以下内容会更有意义:

docker run -i -d $image_id test_container

我建议HEALTHCHECK或者ENTRYPOINTDockerfile 中的指令会在它实际完全启动并运行时打印一些内容。

可以通过指定入口点脚本为 shell,然后向该 shell 发送命令来直接停止/退出容器,在本例中exit

docker run -it -d --entrypoint=/bin/sh alpine:latest exit

就您而言,您可能应该使用$image_id而不是alpine:latest

相关内容