我在bash上运行一个docker Run命令它看起来就像在触发此命令后立即控制开始执行下一行而不是等待docker container启动。 这是码头工作的原因吗?
更新:我使用-dit作为属性,这意味着它在分离模式下运行,我认为这解释了为什么它立即跳转到下一行。由于它是一个VM的启动脚本,它必须分离,但有没有任何选项,我们至少可以等到docker容器完成配置?
答案 0 :(得分:1)
-d
导致容器立即分离。所有容器都有不同的想法,他们什么时候完成他们的配置"并且Docker不知道每个容器的内部是如何工作的,所以Docker很难对此负责。
Docker添加了HEALTHCHECK
,因此您可以专门为您的容器定义测试。然后,您可以查询容器状态并等待它在脚本中成为healthy
。
HEALTHCHECK --interval=1m --timeout=5s \
CMD curl -f http://localhost/ || exit 1
然后在脚本中等待
now="$(date +%s)"
let timeout=now+60
while sleep 5; do
res="$(docker inspect --format='{{.State.Health}}' container_id) 2>&1"
if [ "res" == "healthy" ]; then break; fi
if [ "$(date +%s)" -lt "$timeout" ]; then
echo "Error timeout: $res"
# handle error
break
fi
done
如果您要放弃容器中的curl
,可以修改等待运行任何命令,例如nc
或HEALTHCHECK
docker logs container_id
还可能包含您需要等待的信息。大多数守护进程都会记录类似"准备接受连接"