GNU/Linux >> Linux の 問題 >  >> Linux

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

  • 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

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/


Linux
  1. 実行中のDockerコンテナでコマンドを実行する方法

  2. ユーザーを Docker コンテナに追加するにはどうすればよいですか?

  3. docker コンテナ内で cron ジョブを実行する方法

  1. Dockerコンテナ内でプログラムを実行する方法は?

  2. DockerコンテナでMySQLを実行する方法

  3. Dockerコンテナを終了する方法

  1. 例を使用してDockerRunコマンドを使用する方法

  2. Dockerを使用してJenkinsコンテナをSystemdサービスとして実行する方法

  3. 停止せずに Docker コンテナ内で Nginx を実行する方法は?