尝试通过 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
或者ENTRYPOINT
Dockerfile 中的指令会在它实际完全启动并运行时打印一些内容。
可以通过指定入口点脚本为 shell,然后向该 shell 发送命令来直接停止/退出容器,在本例中exit
:
docker run -it -d --entrypoint=/bin/sh alpine:latest exit
就您而言,您可能应该使用$image_id
而不是alpine:latest
。