最近、cronスケジュールタスク用のdockerを作りたいと思っており、Dockerfileで次のように定義しています library/alpine:latest より apk --update add rsync openssh bash を実行します ボリューム ["/data"] start.sh を追加します / コマンド ["/bin/bash","/start.sh"] crontab を使用して、start.sh でスケジュールされたタスク run.cron をロードし、crond を開始します。
docker build Dockerfile を実行後、docker run –name xxx -d を使用してコンテナを実行しました。start.sh の実行後にコンテナが終了し、スケジュールされたタスクをまったく開始できないことがわかりました。nohup の使用、無限ループ、シグナルの使用など、オンラインでさまざまな方法を試しましたが、どれも信頼できるものではないことがわかりました。 docker のメカニズムを分析した結果、docker コンテナは一度に 1 つのプロセスしか管理できないことがわかりました。プロセスが終了すると、コンテナも終了します。これは、コンテナ内で一度に 1 つのプロセスしか実行できない (それは無駄です) ことを意味するのではなく、最後に実行されているプロセスは終了できないことを意味します。 この場合、コンテナの起動時に start.sh が実行されます。crond のデフォルト設定はバックグラウンドで実行されるため、start.sh の実行が終了し、start.sh が終了するとコンテナが終了します。 したがって、start.sh では、crond をフォアグラウンドで強制的に実行する必要があります: crond -f。 この方法では start.sh は終了せず、docker run -d はコンテナをバックグラウンドで実行し続けることができます。 start.sh の概要: (1)コンテナ内で複数のデーモンプロセスを実行する場合、最初のプロセスをバックグラウンドで実行する必要があります(または&を追加してください)。そうしないと、後続のサービスを開始できません。 (2)コンテナ内の最後のデーモンプロセスはフォアグラウンドモードで実行する必要があります。そうしないと、start.shが終了し、コンテナが終了し、すべてのサービスが無駄に開始されます。 ubuntu:latestから mkdir -p "/usr/src/pdas" を実行します。 mkdir -p "/usr/src/pdas/reload" コピー bin.tar /usr/src/pdas config.tar /usr/src/pdas をコピーします lib.tar /usr/src/pdas をコピーする ワークディレクトリ /usr/src/pdas tar -xvf lib.tar && \ を実行します。 tar -xvf bin.tar && \ tar -xvf config.tar ENV LD_LIBRARY_PATH /usr/src/pdas/lib/libxml/lib:/usr/src/pdas/lib/curl/lib:$LD_LIBRARY_PATH ワークディレクトリ /usr/src/pdas/bin chmod +x start.sh && \ を実行します。 chmod +x f_recv && \ chmod +x f_send ボリューム /behb/diqu ボリューム /var/log/pdas エントリポイント ./start.sh ./start.shスクリプトは以下のとおりです #!/bin/bash ./f_recv & ./f_send 上記は、Docker イメージの起動スクリプトに関するいくつかの考察です。 追加知識: Docker で複数のプロセスを処理する方法 通常、Docker コンテナは単一のプロセスを実行するのに適していますが、多くの場合、Docker コンテナ内で複数のプロセスを実行する必要があります。マルチプロセス コンテナを実行するには、シェル スクリプトを使用する方法とスーパーバイザーを使用する方法の 2 つがあります。どちらの方法もシンプルで、それぞれに長所と短所がありますが、注目すべき詳細がいくつかあります。ここではスクリプトを使用した処理方法についてのみ説明します。 スクリプト multiple_thread.sh を記述します。このスクリプトは 2 つの Python プログラムを実行し、結果をログ ファイルに保存します。スクリプトの内容は次のとおりです #!/bin/bash # 最初のプロセスを開始する nohup python -u /tmp/thread1.py > /tmp/thread1.log 2>&1 & ps aux |grep スレッド1 |grep -q -v grep PROCESS_1_STATUS=$ ですか? echo "thread1 のステータス..." $PROCESS_1_STATUSをエコーする [ $PROCESS_1_STATUS -ne 0 ]の場合; echo "my_first_process の起動に失敗しました: $PROCESS_2_STATUS" $PROCESS_1_STATUS を終了 フィ 睡眠5 # 2番目のプロセスを開始する nohup python -u /tmp/thread2.py > /tmp/thread2.log 2>&1 & ps aux |grep スレッド2 |grep -q -v grep PROCESS_2_STATUS=$ ですか? echo "thread2 ステータス..." $PROCESS_2_STATUSをエコーする [ $PROCESS_2_STATUS -ne 0 ]の場合; echo "my_second_process の起動に失敗しました: $PROCESS_2_STATUS" $PROCESS_2_STATUS を終了 フィ # sleep 60; 中にプロセスが60秒ごとに実行されているかどうかを確認します ps aux |grep スレッド1 |grep -q -v grep PROCESS_1_STATUS=$ ですか? ps aux |grep スレッド2 |grep -q -v grep PROCESS_2_STATUS=$ ですか? # 上記のgrepで何かが見つかった場合は、0ステータスで終了します # 両方とも 0 でない場合は、何かがおかしい [ $PROCESS_1_STATUS -ne 0 -o $PROCESS_2_STATUS -ne 0 ]の場合; echo "プロセスの 1 つはすでに終了しています。" 出口1 フィ 次に、Dockerfile を作成します。 Centos:latest から thread1.py をコピー /tmp/thread1.py thread2.py をコピー /tmp/thread2.py multiple_thread.sh をコピー /tmp/multiple_thread.sh コマンド bash /tmp/multiple_thread.sh Docker コンテナ内で 2 つのプロセスを開始するための上記の Dockerfile 実装コードは、私が皆さんと共有できるすべてです。これが皆さんの参考になれば幸いです。また、123WORDPRESS.COM を応援していただければ幸いです。 以下もご興味があるかもしれません:
|
VMware ワークステーションの仮想マシンの互換性の問題を解決するにはどうすればよいですか?ノート...
この記事では、Linux のユーザーとグループの管理によく使用されるコマンドをまとめます。ご参考まで...
フォームを作成するときに、名前、携帯電話番号、出生地などの 2 つのフィールドを揃える状況に遭遇する...
目次背景関数目的アイデアの源成し遂げるセット得るプロパティの削除拡張機能を禁止するもっている要約する...
私たちのコンピューターには、ディレクトリ、写真、ソース コードなどのファイルが保存されています。たく...
1pxの線が太くなる理由モバイルプロジェクトに取り組むとき、設計図に従って要素ノードのサイズとスタイ...
この記事では、VMware 12でのUbuntu 16.04のインストールチュートリアルを参考までに...
1. 圧縮と包装の概要一般的な圧縮ファイルウィンドウズ .rar .zip .7z Linux .z...
前回の記事では、Docker を使用して Laravel アプリケーションをデプロイする方法について...
1. Docker とは何ですか? (1)DockerはLinuxコンテナ内でアプリケーションを実行...
目次1. プロジェクトの説明: 2. プロジェクト環境: 2. プロジェクトの手順: 3. プロジェ...
NodeJS は次のファイルをコピーします:通常、小さなファイルのコピー操作では、ストリーム パイプ...
余計なことは言わないで、コードだけ見てみましょう〜 -- テーブル内のフィールドコメントを表示および...
目次1. 部分文字列() 2. サブストラクチャ() 3.インデックス() 4.最後のインデックス(...
夜遅くまで何度も困難なシングルステップデバッグを行った後、ようやく理想的なブレークポイントを見つけま...