ソフトウェアがインストールおよび構成されたDockerコンテナーがあります。
常に起動/実行されることになっているプログラムはありません。
私が欲しいもの-外部イベントに応じていくつかのコマンドを開始する能力。お気に入り:
docker exec mysupercont /path/to/mycommand -bla -for
そして
docker exec mysupercont /path/to/myothercommand
しかし、コンテナが停止している場合は「exec」は不可能です。また、このコンテナには、そのコマンドに使用される「作業」データが含まれているため、使用できません。
docker run ...
毎回、イメージからコンテナーを再作成し、私のデータを破壊するためです。
そのようなコンテナを実行し続けるための「正しい」および「最良の」方法は何ですか?内部で開始できるコマンドはどれですか?
毎回行う必要はありませんdocker run
。
docker run
は実際には、「作成」と「開始」の2つのコマンドのシーケンスです。
コンテナを実行するときは、「-it
":
-i、--interactive = false接続されていなくてもSTDINを開いたままにします
-t、-tty = false疑似TTYを割り当てます
例:
docker run -it debian:stable bash
作業が完了した後、起動時に指定されたコマンド(私の例ではbash)。たとえば、「終了」を実行します。コンテナ停止:
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
1329c99a831b debian:stable "bash" 51 seconds ago Exited (0) 1 seconds ago goofy_bardeen
今、あなたはそれを再び始めることができます
docker start 1329c99a831b
コンテナが起動し、コマンド「bash」を再度実行します。
次のコマンドでこのセッション「bash」に接続します
docker attach 1329c99a831b
まとめると:run
コンテナとstart
コンテナの違いを理解する必要があります。
さらに、パラメーターの役割については documentation を参照してください "-i t
"および" -d
""実行 "
停止したコンテナを開始できるかどうかというこのビジネス全体は、コンテナが最初に作成された方法、つまり実行された方法によって異なります。終了したコマンドを実行した場合、またはインタラクティブコマンドを終了した場合。 bash、停止したコンテナーを起動、再起動、または実行することはできません。あなたができることはそれを取り除くことだけです。ジャンクです。
しかし、タラナキの最後のコメントである「-itd」を使用すると、ドッカーが注文したようです。
コンテナは実行を続け、好きなように実行したり、コンテナを停止、起動、再起動したりできます。もちろん、これはアルプスのイメージに基づく予備的な発見にすぎません。コンテナにアタッチすると、終了時に停止しますが、再度開始できます。
あなたは定期的なタスクについて言及していて、docker exec
を使いたいという理由でおそらくcronのようなものを使用しているので、私はあなたのための薬しか持っていません。少なくとも私はこのようなことをすることになりました。
Dockerfile
FROM <some base>
CMD tail -f /dev/null
通常のdocker run -d ....
で実行します(私はdocker-compose
を使用しました)
ホストマシンのcrontabを設定します。次に例を示します。
* * * * * docker exec mysupercont foo >> /var/log/foo.log 2>&1
* * * * * docker exec mysupercont bar >> /var/log/bar.log 2>&1
かなりデフォルトのLinux環境で古くて実績のあるcrontabに依存できるようになり、Dockerがビジネスロジックのよりエキゾチックなdepと環境変数を処理するので、このソリューションは素晴らしいと思います。定期的なタスクが行き詰まり、メモリリークなどが発生した場合は、いくつかの制限を設定することもできます。
テールはまだ時々いくつかのファイル操作を引き起こします。
これが、副作用なしで永遠に眠る私の解決策です。
# Ah, ha, ha, ha, stayin' alive...
while true; do :; done & kill -STOP $! && wait $!
仕組み
while true; do :; done & # do nothing(:) in background, in an endless loop
kill -STOP $! # stop the background process of doing nothing
wait $! # wait forever, because doing nothing process is stopped