如何让docker-compose等待指定容器全部执行成功后返回正确退出码?
docker compose的--exit-code-from仅支持指定单个参考服务,无法同时监听多个服务的退出状态,所以你之前的尝试无法达到预期效果,有两种常用实现方案:
方案一:新增专用等待服务(无额外脚本,依赖compose原生能力)
修改你的docker-compose.yml,新增一个专门的等待服务,只有client和tests都执行成功时该服务才会启动:
version: "3.9" services: tests: image: tests tty: true depends_on: - "server" links: - "server:srv" client: image: client tty: true depends_on: - "server" links: - "server:srv" server: image: server tty: true ports: - "8081:80" # 新增等待服务 all-jobs-done: image: busybox:latest depends_on: client: condition: service_completed_successfully tests: condition: service_completed_successfully command: "echo All jobs finished successfully"
执行以下命令即可达到需求:
docker-compose -f docker/docker-compose.yml up --exit-code-from all-jobs-done --abort-on-container-exit
--exit-code-from all-jobs-done:最终返回码和等待服务的退出码保持一致--abort-on-container-exit:任意容器退出就停止整个compose集群:如果client/tests任意一个执行失败,等待服务不会启动,失败容器退出时会触发集群停止并返回非0错误码;如果两个任务都执行成功,等待服务启动后快速退出,触发集群停止并返回0状态码。
方案二:无需修改compose配置,用shell脚本包装执行
编写执行脚本run.sh如下:
#!/bin/bash # 后台启动所有服务 docker-compose -f docker/docker-compose.yml up -d # 等待client执行完成,获取退出码 CLIENT_ID=$(docker-compose -f docker/docker-compose.yml ps -q client) CLIENT_EXIT=$(docker wait $CLIENT_ID) echo "Client exit code: $CLIENT_EXIT" # 等待tests执行完成,获取退出码 TEST_ID=$(docker-compose -f docker/docker-compose.yml ps -q tests) TEST_EXIT=$(docker wait $TEST_ID) echo "Tests exit code: $TEST_EXIT" # 停止所有服务清理资源 docker-compose -f docker/docker-compose.yml down -v # 两个任务都成功才返回0 if [ $CLIENT_EXIT -eq 0 ] && [ $TEST_EXIT -eq 0 ]; then echo "All jobs succeeded" exit 0 else echo "Some jobs failed" exit 1 fi
给脚本添加执行权限后直接运行即可:
chmod +x run.sh ./run.sh
内容的提问来源于stack exchange,提问作者Adam Matan
相关产品推荐
相关产品推荐

