根据Compose中控制启动顺序,可以使用“wait-for-it”脚本来控制Docker Compose启动容器的顺序。脚本
如何向
在我的情况下,我实现了一个脚本
Docker Compose将
在成功退出之前,另一个自定义容器
一旦容器
wait-for-it.sh
需要一个host:port
参数以及当端口可用时脚本应执行的命令。文档建议Docker Compose使用entrypoint:
选项调用此脚本。但是,如果使用此选项,则容器将不再运行其默认的ENTRYPOINT
或CMD
,因为entrypoint:
会覆盖默认设置。如何向
wait-for-it.sh
提供此默认命令,以便在满足等待条件时脚本可以调用默认的ENTRYPOINT
或CMD
?在我的情况下,我实现了一个脚本
wait-for-file.sh
,它轮询等待文件存在:#!/bin/bash
set -e
waitFile="$1"
shift
cmd="$@"
until test -e $waitFile
do
>&2 echo "Waiting for file [$waitFile]."
sleep 1
done
>&2 echo "Found file [$waitFile]."
exec $cmd
Docker Compose将
wait-for-file.sh
作为入口点调用,该脚本位于从tomcat:8-jre8
派生的稍微自定义的容器中: platinum-oms:
image: opes/platinum-oms
ports:
- "8080:8080"
volumes_from:
- liquibase
links:
- postgres:postgres
- activemq:activemq
depends_on:
- liquibase
- activemq
entrypoint: /wait-for-file.sh /var/run/liquibase/done
在成功退出之前,另一个自定义容器
liquibase
创建了/var/run/liquibase/done
,因此platinum-oms
有效地等待容器liquibase
完成。一旦容器
liquibase
创建了文件/var/run/liquibase/done
,wait-for-file.sh
会打印Found file [/var/run/liquibase/done].
,但无法调用基础容器tomcat:8-jre8
中的默认命令catalina.sh run
。为什么?
测试场景
我创建了一个简化的测试场景docker-compose-wait-for-file
来展示我的问题。容器ubuntu-wait-for-file
等待容器ubuntu-create-file
创建文件/wait/done
,然后我期望容器ubuntu-wait-for-file
调用默认的ubuntu
容器命令/bin/bash
,但是它却退出了。为什么它不像我期望的那样工作?
wait-for-it
如何确定并运行容器中的原始ENTRYPOINT
或CMD
? 实际上,我希望wait-for-it
在测试成功后委派给默认容器命令。 如果容器隐藏此命令,wait-for-it
如何做到这一点? 至少在我的情况下,如果脚本无法运行原始容器命令,wait-for-it
等待条件再让容器继续进行没有太大用处。 - Derek Maharubuntu
镜像,该镜像有一个默认命令https://github.com/tianon/docker-brew-ubuntu-core/blob/045b1c500151a8239fce3cedd1fd656e7c113041/xenial/Dockerfile#L34。`wait-for-file.sh`不应该调用这个命令吗? - Derek Mahartomcat:8-jre8
,该镜像有一个默认命令catalina.sh run
。 - Derek Mahar