web-dev-qa-db-ja.com

Dockerコンテナで実行されるプログラムに信号を送信する方法は?

分離モードのdockerコンテナーでプログラムを実行しています。

では、このプログラムにSIGINTなどのシグナルを送信する方法は?

25
atupal

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/

11
Regan

docker kill --signal="<signal>" <container name or id>を使用して、特定のコンテナのルートプロセスに信号を送信できます。

https://docs.docker.com/engine/reference/commandline/kill/#send-a-custom-signal--to-a-container を参照してください

63
Andy
  • docker killは、メインコンテナプロセス、つまりPID 1のプロセスに信号を送信するために使用されます。
  • PID 1のアプリケーションは、信号を直接処理できます。以下のコマンドは、メインのdockerプロセスを強制終了します:$ docker kill --signal="SIGTERM" container-id/name
  • ただし、PID 1を持たないアプリケーション、つまりアプリケーションはバックグラウンドプロセスです。
    • Dockerコンテナ内で実行されているバックグラウンドプロセスに直接シングルを送信することはできません。
    • この場合、エントリポイントとして実行されているシェルスクリプト内のユーザー定義信号をトラップして処理する必要があります。
  • 次の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
7
Sudhanshu Dev

私はドッカーコンテナのプロセス(プログラム)に希望する信号を送信することができました:

  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)
1
hipokito