簡體   English   中英

如何向docker容器中運行的程序發送信號?

[英]How to send signal to program run in a docker container?

我有一個程序在一個具有分離模式的docker容器中運行。

那么如何向這個程序發送SIGINT等信號呢?

您可以使用docker kill --signal="<signal>" <container name or id>將任何信號發送到給定容器的根進程。

請參閱https://docs.docker.com/engine/reference/commandline/kill/#send-a-custom-signal--to-a-container

您可以使用nsenter進入容器空間並發送信號。

PID=$(docker inspect --format {{.State.Pid}} <container_name_or_ID>)
nsenter --target $PID --mount --uts --ipc --net --pid kill -SIGINT <PID of your program inside your container>

更多信息: http//jpetazzo.github.io/2014/06/23/docker-ssh-considered-evil/

  • docker kill用於向主容器進程發送信號,即使用PID 1進行處理。
  • PID 1的任何應用都可以直接處理信號。 下面的命令會殺死主要的$ docker kill --signal="SIGTERM" container-id/name進程: $ docker kill --signal="SIGTERM" container-id/name
  • 但是沒有PID 1即應用程序的應用程序是后台進程:
    • 我們無法直接向docker容器中運行的任何后台進程發送單個。
    • 在這種情況下,我們需要在作為入口點運行的shell腳本中捕獲和處理用戶定義的信號。
  • 我們有以下Dockerfile (根據申請更新)

FROM centos:6.7
# Install/Deploye the service below.

# Copy the shell script.
COPY entrypoint.sh /home
EXPOSE 8080
ENTRYPOINT ["/home/entrypoint.sh"]

  • 以下是entrypoint.sh (根據應用程序更新它)。 假設我們要重新啟動init.d服務。

     #start the service /etc/init.d/<servicename> start pid="$!" # SIGUSR1- Single handler my_handler() { /etc/init.d/<servicename> restart } # Trap and handle the user defind singnal. trap 'my_handler' SIGUSR1 # wait forever(Alive container.) while true do tail -f /dev/null & wait ${!} done 
  • 構建docker鏡像並運行容器。
  • 現在您可以從主機重啟服務: $docker kill --signal="SIGUSR1" container-id/name

我設法通過以下方式向docker容器中的進程(程序)發送我想要的信號:

  1. 獲取容器的ID - docker ps | grep yourProgramName - 對我來說看起來像是這樣 - 4b6425cf4261
  2. 使用docker exec -it 4b6425cf4261 bash登錄容器
  3. 使用ps -A列出所有正在運行的進程
  4. 找到要將SIGINT發送到的進程的PID
  5. 發送信號給它:kill -SIGINT PID (例如:kill -SIGINT 15)

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM