当我运行docker start
时,似乎在docker start
命令返回时容器可能没有完全启动。是吗?
在命令返回之前,有没有办法等待容器完全启动?谢谢。
答案 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容器的解决方案。其思想是使用运行状况检查命令配置该容器,该命令用于确定主服务是否已完全 启动并正常运行。
指定的命令在容器内运行,并将运行状况设置为starting
,healthy
或unhealthy
取决于其退出代码(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
希望有帮助。