web-dev-qa-db-ja.com

定期的なタスクに使用するときにdockerコンテナーを起動したままにする正しい方法

ソフトウェアがインストールおよび構成されたDockerコンテナーがあります。

常に起動/実行されることになっているプログラムはありません。

私が欲しいもの-外部イベントに応じていくつかのコマンドを開始する能力。お気に入り:

docker exec mysupercont /path/to/mycommand -bla -for

そして

docker exec mysupercont /path/to/myothercommand 

しかし、コンテナが停止している場合は「exec」は不可能です。また、このコンテナには、そのコマンドに使用される「作業」データが含まれているため、使用できません。

docker run ...

毎回、イメージからコンテナーを再作成し、私のデータを破壊するためです。

そのようなコンテナを実行し続けるための「正しい」および「最良の」方法は何ですか?内部で開始できるコマンドはどれですか?

43
Korjavin Ivan

毎回行う必要はありません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 ""実行 "

49
MSemochkin

停止したコンテナを開始できるかどうかというこのビジネス全体は、コンテナが最初に作成された方法、つまり実行された方法によって異なります。終了したコマンドを実行した場合、またはインタラクティブコマンドを終了した場合。 bash、停止したコンテナーを起動、再起動、または実行することはできません。あなたができることはそれを取り除くことだけです。ジャンクです。

しかし、タラナキの最後のコメントである「-itd」を使用すると、ドッカーが注文したようです。

コンテナは実行を続け、好きなように実行したり、コンテナを停止、起動、再起動したりできます。もちろん、これはアルプスのイメージに基づく予備的な発見にすぎません。コンテナにアタッチすると、終了時に停止しますが、再度開始できます。

7
Sue Parker

あなたは定期的なタスクについて言及していて、docker execを使いたいという理由でおそらくcronのようなものを使用しているので、私はあなたのための薬しか持っていません。少なくとも私はこのようなことをすることになりました。

  1. Dockerfile

    FROM <some base>
    CMD tail -f /dev/null
    
  2. 通常のdocker run -d ....で実行します(私はdocker-composeを使用しました)

  3. ホストマシンの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と環境変数を処理するので、このソリューションは素晴らしいと思います。定期的なタスクが行き詰まり、メモリリークなどが発生した場合は、いくつかの制限を設定することもできます。

6
elnygren

テールはまだ時々いくつかのファイル操作を引き起こします。

これが、副作用なしで永遠に眠る私の解決策です。

# 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
0
qoomon