如何等待直到docker start完成?

时间:2019-01-16 04:04:27

标签: docker

当我运行docker start时,似乎在docker start命令返回时容器可能没有完全启动。是吗?

在命令返回之前,有没有办法等待容器完全启动?谢谢。

2 个答案:

答案 0 :(得分:1)

免责声明,我不是Docker方面的专家,所以很高兴自己知道是否存在更好的解决方案。

泊坞窗系统并不真正知道容器“可能没有完全启动”。

因此,不幸的是,在Docker中与此无关。 通常,应该以某种方式来组织docker映像创建者使用的命令(在Dockerfile中),即一旦docker start命令在映像上结束后,容器将可以使用,并且是最好的方式。但是,情况并非总是如此。

这里是一个例子:

Localstack是一组用于AWS本地开发的服务,具有docker映像,但是一旦启动,例如,S3端口尚未准备好获得连接。 据我了解,未公开的端口将是您所指的典型情况。

因此,根据我的经验,在与Docker进程进行通讯的应用程序中,尝试连接到服务器端口的尝试应包含在重试中,并且一旦可用就可以。

答案 1 :(得分:1)

一种确保容器完全启动(即服务正在运行,端口打开等)的常用技术是等待直到记录了特定的字符串。请参见处理PostgreSql和Rails的示例Waiting until Docker containers are initialized

已编辑:

还有一种使用HEALTHCHECK的Docker容器的解决方案。其思想是使用运行状况检查命令配置该容器,该命令用于确定主服务是否已完全 启动并正常运行。

指定的命令在容器内运行,并将运行状况设置为startinghealthyunhealthy 取决于其退出代码(0-容器健康,1-容器不健康)。然后可以检索容器的状态 通过检查正在运行的实例(docker inspect)在主机上运行。

可以在Dockerfile内部或运行容器时配置运行状况检查选项。这是PostgreSQL的简单示例

 docker run --name postgres --detach \
  --health-cmd='pg_isready -U postgres' \
  --health-interval='5s' \
  --health-timeout='5s' \
  --health-start-period='20s' \
  postgres:latest && \
  until docker inspect --format "{{json .State.Health.Status }}" postgres| \
  grep -m 1 "healthy"; do sleep 1 ; done

在这种情况下,运行状况命令为pg_isready。 Web服务通常将使用curl,其他容器具有其特定命令 docker社区为几种官方映像here

提供了这种配置

现在,当我们重新启动容器(docker start)时,它已经配置好了,我们只需要第二部分:

docker start postgres && \
until docker inspect --format "{{json .State.Health.Status }}" postgres|\ 
grep -m 1 "healthy"; do sleep 1 ; done

当容器标记为healthy

时,该命令将返回。

希望有帮助。