我有以下docker-compose文件
version: '3' services: serviceA: image: my/serviceA container_name: serviceA serviceB: image: my/serviceB container_name: serviceB
我想在serviceA容器退出后运行serviceB容器。有没有办法等待serviceA退出,然后运行容器serviceB?
jdgnovmf1#
您可以在第二个容器上配置一个脚本来ping第一个容器,有点像https://docs.docker.com/compose/startup-order/,但检查容器是否关闭而不是打开。然而,从经验来看,这是一个小错误容易。我更喜欢运行两次docker-compose。假设第一个容器在命令执行后退出,您可以运行serviceA而不使用守护进程标志-d,然后运行serviceB
serviceA
-d
docker-compose up serviceA docker-compose up -d serviceB
如果有用的话,可以将这些命令放在脚本中。
5anewei62#
Docker Compose不支持这个。服务B有一个或多或少的standard trick来等待服务A启动。如果一个服务有办法看到另一个服务(例如,服务A正在运行一个在私有Docker网络上可见的网络服务),那么服务B可以等待A启动,然后等待B停止,然后完成它的工作。但是,您将无法看到A是否成功退出。如果您愿意在主机上为服务B提供潜在的不受限制的root访问权限,则可以将Docker socket装入其容器,然后它可以监视服务A是否退出。更干净的做法可能是纠正某个协调器服务C,它启动了A,看到它退出,然后启动了B。(If如果你在Kubernetes中,它有一个pre-stop hook,可以在服务A退出之前运行脚本,但这是一个非常重要的答案。
uqdfh47h3#
可以使用depends_on。
depends_on
version: '3.8' services: serviceA: image: my/serviceA container_name: serviceA serviceB: image: my/serviceB container_name: serviceB depends_on: serviceA: condition: service_completed_successfully
参见:https://docs.docker.com/compose/compose-file/compose-file-v3/#depends_on
3条答案
按热度按时间jdgnovmf1#
您可以在第二个容器上配置一个脚本来ping第一个容器,有点像https://docs.docker.com/compose/startup-order/,但检查容器是否关闭而不是打开。
然而,从经验来看,这是一个小错误容易。我更喜欢运行两次docker-compose。假设第一个容器在命令执行后退出,您可以运行
serviceA
而不使用守护进程标志-d
,然后运行serviceB如果有用的话,可以将这些命令放在脚本中。
5anewei62#
Docker Compose不支持这个。
服务B有一个或多或少的standard trick来等待服务A启动。如果一个服务有办法看到另一个服务(例如,服务A正在运行一个在私有Docker网络上可见的网络服务),那么服务B可以等待A启动,然后等待B停止,然后完成它的工作。但是,您将无法看到A是否成功退出。
如果您愿意在主机上为服务B提供潜在的不受限制的root访问权限,则可以将Docker socket装入其容器,然后它可以监视服务A是否退出。更干净的做法可能是纠正某个协调器服务C,它启动了A,看到它退出,然后启动了B。
(If如果你在Kubernetes中,它有一个pre-stop hook,可以在服务A退出之前运行脚本,但这是一个非常重要的答案。
uqdfh47h3#
可以使用
depends_on
。参见:https://docs.docker.com/compose/compose-file/compose-file-v3/#depends_on