Dockerコンテナ内で2つのプロセスを開始するときのDockerfile実装コード

Dockerコンテナ内で2つのプロセスを開始するときのDockerfile実装コード

最近、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 を開始します。

/usr/bin/crontab /run.cron

/usr/sbin/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 を応援していただければ幸いです。

以下もご興味があるかもしれません:
  • DockerはDockerfileを使用して、sshサービスの自動起動をサポートするコンテナイメージを作成します。
  • Docker コンテナで DockerFile を使用して複数の Tomcat サービスをデプロイする手順
  • MyEclipse でビルドした Java Web プロジェクトを Docker の Dockerfile コンテナーで実行する
  • Dockerfileを使用してシンプルなコンテナを作成する方法

<<:  innerHTML アプリケーション

>>:  JSの基本概念の詳細な紹介

推薦する

VMware ワークステーションの仮想マシンの互換性の問題に対する解決策

VMware ワークステーションの仮想マシンの互換性の問題を解決するにはどうすればよいですか?ノート...

Linux のユーザーとグループ管理によく使われるコマンドの概要

この記事では、Linux のユーザーとグループの管理によく使用されるコマンドをまとめます。ご参考まで...

CSS テキスト配置実装コード

フォームを作成するときに、名前、携帯電話番号、出生地などの 2 つのフィールドを揃える状況に遭遇する...

Vueのアイデアを使ってストレージをカプセル化する方法

目次背景関数目的アイデアの源成し遂げるセット得るプロパティの削除拡張機能を禁止するもっている要約する...

Linux コマンドラインのクイックヒント: ファイルの検索方法

私たちのコンピューターには、ディレクトリ、写真、ソース コードなどのファイルが保存されています。たく...

モバイル開発における 1px ラインの理解と解決策

1pxの線が太くなる理由モバイルプロジェクトに取り組むとき、設計図に従って要素ノードのサイズとスタイ...

VMware 12 での Ubuntu 16.04 インストール チュートリアル

この記事では、VMware 12でのUbuntu 16.04のインストールチュートリアルを参考までに...

Linux のファイル圧縮とパッケージ化の概要

1. 圧縮と包装の概要一般的な圧縮ファイルウィンドウズ .rar .zip .7z Linux .z...

Docker はキューとタスクのスケジューリングを実現するために Laravel アプリケーションをデプロイします

前回の記事では、Docker を使用して Laravel アプリケーションをデプロイする方法について...

Dockerコアとインストールの具体的な使い方

1. Docker とは何ですか? (1)DockerはLinuxコンテナ内でアプリケーションを実行...

デュアル VIP を使用した高可用性 MySQL クラスタの構築

目次1. プロジェクトの説明: 2. プロジェクト環境: 2. プロジェクトの手順: 3. プロジェ...

Node.js ファイルのコピー、フォルダの作成、その他の関連操作

NodeJS は次のファイルをコピーします:通常、小さなファイルのコピー操作では、ストリーム パイプ...

Mysql テーブルコメントフィールド取得操作

余計なことは言わないで、コードだけ見てみましょう〜 -- テーブル内のフィールドコメントを表示および...

文字列から指定された文字を削除または抽出する JavaScript メソッド (非常によく使用されます)

目次1. 部分文字列() 2. サブストラクチャ() 3.インデックス() 4.最後のインデックス(...

初心者がソースコードからMySQLのデッドロック問題を理解する

夜遅くまで何度も困難なシングルステップデバッグを行った後、ようやく理想的なブレークポイントを見つけま...