我正在bash上运行一个docker命令,看起来在启动这个命令控件之后,立即开始执行下一行,而不是等待docker容器启动。这就是码头的工作方式吗?
更新:我使用-dit作为属性,这意味着它是以分离模式运行的,我认为这解释了为什么它会立即跳到下一行。因为它是VM的启动脚本,所以它必须被分离,但是是否有任何选项,我们至少可以等待码头容器完成它的配置?
发布于 2018-02-23 00:09:41
-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
或nc
。
docker logs container_id
还可能包含需要等待的信息。大多数守护进程都会记录类似于“准备好接受连接”之类的内容。
https://stackoverflow.com/questions/48942860
复制相似问题