我有 2 个运行并相互通信的 docker 容器。下面是他们的 docker-compose.yml文件:
version: '3'
services:
test_server:
image: <imageURL>
ports:
- xxxx:xxxx
test_client:
image: <imageURL>
depends_on:
- test_server
这是用于编写和运行 docker 的buildspec.yml:
version: 0.2
env:
exported-variables:
- CODEBUILD_BUILD_NUMBER
phases:
build:
commands:
- cd docker_compose_folder
- docker-compose pull
- docker-compose up --abort-on-container-exit --no-build
这test_server
基本上是一个服务器无限期地等待test_client
连接并执行某些测试(在客户端完成)。一旦test_client
测试完成,测试覆盖就会发生,并且 shell 脚本test_client
与容器一起在出口上运行。一直在无限循环中test_server
等待下一个客户端连接。
现在由于--abort-on-container-exit
并test_server
取决于test_client
,一旦客户端退出,服务器也会退出。但我希望服务器接收我在服务器脚本中捕获的信号(SIGINT 或 SIGTERM)并将其传递给应用程序(信号也在应用程序中处理),然后在退出之前执行代码覆盖步骤。
问题是如果我docker kill -s SIGTERM
手动执行,则服务器上运行的脚本会接收并捕获 SIGTERM。但是,当我进行代码构建或自动化时,我无法捕获由 SIGTERM 发送的--abort-on-container-exit
(我猜这无法完成 - https://github.com/docker/compose/issues/7652)并且容器得到一个 SIGKILL并在运行测试覆盖之前退出。
我的问题是 - 我如何在客户端退出后退出服务器并发送一个可以被服务器捕获的信号以等待并执行覆盖并在退出之前完成脚本?
入口点test_server
:
ENTRYPOINT ["./runServer.sh"]
运行服务器.sh
#!/usr/bin/env bash
trap 'echo "Terminated CGX."; kill -TERM $PID' TERM INT
./StartServerAndWaitForConnection &
PID=$!
wait $PID
trap - TERM INT
wait $PID
./genCovReport.sh
test_client
与server类似,但没有任何信号陷阱,自然退出。
TIA。如果需要,我可以提供更多信息。