systemd
再起動時に完全に機能し、自動的に起動する次のsystemctl起動スクリプトがあります(他のdbdeployerの依存関係も起動します)。
.sh script
基本的に呼び出されるサービスについて、ここにいくつかの異なる「状態」を作成しました。
(スタートスクリプトはドッカーが書いたプロジェクトであり、もう一つはdbdeployer mysqlインスタンス)
システム化されたサービスユニットドッカー作成コンテナ:
[Unit]
Description=Magento 2.3.5 Docker-Compose Containers
After=dbdeployer-mysql-5-731-in-1.service
Requires=docker.service dbdeployer-mysql-5-731-in-1.service
[Service]
EnvironmentFile=/var/www/_systemd.startups_/glolighting/magento/2_35/docker-compose.mag2.35.env.file
#Environment=FILE_SCRIPT=/var/www/docker/_systemd.startups_/magento/2_35/dc-glo-mag235.sh
#PassEnvironment=$DCFOLDER
Type=simple
TimeoutStartSec=0
Restart=always
RestartSec=4s
RemainAfterExit=yes
#WorkingDirectory=${DC_PROJECT_FOLDER}
ExecStartPre=mkdir -p ${LOGFOLDER}
ExecStartPre=echo ${DC_PROJECT_FOLDER}
ExecStartPre=echo Starting Docker-compose service for ${DESCRIPTION}...
ExecStartPre=bash ${SERVICE_FILE_SCRIPT} ${DC_PROJECT_FOLDER} 1
ExecStart=bash ${SERVICE_FILE_SCRIPT} ${DC_PROJECT_FOLDER} 2
ExecStartPost=bash ${SERVICE_FILE_SCRIPT} ${DC_PROJECT_FOLDER} 1
ExecStop=bash ${SERVICE_FILE_SCRIPT} ${DC_PROJECT_FOLDER} 3
ExecStopPost=bash ${SERVICE_FILE_SCRIPT} ${DC_PROJECT_FOLDER} 1
[Install]
WantedBy=multi-user.target
スクリプト名は次のとおりですsystemd
。
____truncated for relevance___
# Continue on success
if [ $arguments_correct -eq 1 ]; then
cd $PATH_DOCKER_COMPOSE_PROJECT_FILE
if [ $OPTION -eq 1 ]; then
echo "$LINE"
echo ""
$(which docker-compose) ps
echo ""
echo "$LINE"
elif [ $OPTION -eq 2 ]; then
$(which docker-compose) start
elif [ $OPTION -eq 3 ]; then
$(which docker-compose) stop
fi
exit 0
fi
ExecStartPost=bash ${SERVICE_FILE_SCRIPT} ${DC_PROJECT_FOLDER} 1
正しい出力が提供されることを望んでいます($(which docker-compose) ps
つまり、遅延があります。Dockerコンテナには約3〜10秒かかることがあるため、この状態はコマンドが呼び出されるたびに更新(再クエリ)されません。)status
、ソースが発生した場合にのみ出力が表示されますExecStartPost
。
要約すると、これを行うと、systemctl status docker-compose-mag235.service
一部のドッカーコンテナがまだexit/starting
生きていることを示す出力が表示されます。
質問
systemctl status docker-compose-mage235.service
私に以下を提供するために使用できる方法(またはそれに対応するsystemctl
コマンド)がありますか?アップデートステータス。 _つまり、$(which docker-compose) ps
この新しいsystemctlコマンドを実行したときの状態です。
(これらの起動システムサービスを作成する前に、常に各呼び出しがステータスを「再クエリ」すると仮定していましたが、ログファイルから最後の出力のみを取得することに気づきました(おそらくsyslog
)。
メモ:
呼び出し/location/of/project/file/of/docker-compose.yml
は可能ですが、Docker Composeプロジェクトに基づいてクエリできるさまざまなクエリに対応したいと思いますsystemd services
。つまり、さまざまなDCプロジェクト用の複数のフォルダがあります。その後、エイリアスを作成する必要があります。そうする前に、これが役に立つsystemd
かどうかがわかります。
答え1
docker-compose
いいえ、systemdのログに追加情報を送信できない場合は不可能です。
systemctl status
サービスステータスとそのサービスの最新のジャーナルエントリを表示します。
を実行すると、より多くのログエントリを表示できますjournalctl -b0 -p 0..7 -u docker-compose
。これにより、最後に再起動した後のすべてのdocker-composeログエントリが提供されます。
答え2
「アップデートステータス」を直接取得できないことを指摘した@casに感謝しますsystemd
。彼は私にそれを指摘し、次のように提案しました。
ExecStartPostスクリプトが完了する前にすべてが正しく開始されたこと(各チェックの間に1〜2秒以上のスリープモードを含む)を繰り返しチェックする理由はありません。ログログにさらにステータス情報を出力できますか?わかりません...多分STDERRで印刷することができます。
これはスクリプトを遅らせることができるという事実に気づきました。これは元の目標ですsystemd 'somestatuscommand-that-queries'
。
私の場合は、追加の入力パラメータを指定してスクリプトを少し調整できます。場合ExecStartPost
のみExecStopPost
実行。
次のコマンドでのみ使用できる追加の入力パラメータ:
ExecStartPost=bash ${SERVICE_FILE_SCRIPT} ${DC_PROJECT_FOLDER} 1 **4**
ExecStopPost=bash ${SERVICE_FILE_SCRIPT} ${DC_PROJECT_FOLDER} 1 **4**
____truncated for relevance___
# Continue on success
if [ $arguments_correct -eq 1 ]; then
cd $PATH_DOCKER_COMPOSE_PROJECT_FILE
if [ $OPTION -eq 1 ]; then
if [ $sleep_correct -eq 1]; then
# Sleep here when requested (and sleep input verified above)
sleep $SLEEP
fi
#Now docker-compose ps has been given enough time to query after containers were started/stopped.
echo "$LINE"
echo ""
$(which docker-compose) ps
echo ""
echo "$LINE"
elif [ $OPTION -eq 2 ]; then
$(which docker-compose) start
elif [ $OPTION -eq 3 ]; then
$(which docker-compose) stop
fi
exit 0
fi
このタイプの機能がなぜ提供されないのかわかりませんsystemd
。今は理解できないいくつかの重要な設計決定を想定していますが、これはsystemd
各「スクリプトタイプ単位」の追加作業を意味します。