Docker Python SDKによる実行中のコンテナ寿命の管理
3406 ワード
私は最近サービスを構築し始めました、ユーザー要求に関して、コンテナを作成してください(サービスを提供するために、コンテナ- a - A - Service - style Workloadでありません)、そして、1 - 3時間後に、容器(ユーザのセッションとローカルデータをそれと取り去ります)を終えてください.そのためには、 コンテナのstartedatタイムスタンプを取得する タイムスタンプを比較してください. コンテナがその制限を超えている場合、それは停止された状態でキューに入れられ、その後画像を剪定する スクリプトの設定は以下のようになります.
これらは全て主要な関数で実行される:
dateparser - python parser for human readable dates - DateParser 1.0.0 documentation Docker SDK for Python
from datetime import datetime
import docker, dateparser
そして、比較のために文字列を初期化し、timestampが提供しているdocker APIのように正規化されます(これらはさらに変換されます.STARTING_TIME = str(datetime.now()).split(" ")[0]+ "T" + str(datetime.now()).split(" ")[1] + "Z"
次に、何かを行う前にDockerクライアントを設定します.client = docker.APIClient(base_url='unix://var/run/docker.sock')
SDKではコンテナを停止するにはLow level API functionality , ですから、これらの機能を必要としない限り、クライアントをDockerに残すことができます.fromenve env ()はこれ以上の引数を使用しないでください.def compare_time(run_time,container_started_at):
dt = dateparser.parse(container_started_at).timestamp()
mt = dateparser.parse(run_time).timestamp()
interval = mt - dt
return interval
この関数は2つの引数をとります.def eval_interval(interval):
eval = (interval / 60 ) / 60
if eval > 2.0:
return True
else:
return False
そして、時間の差がこの場合、2時間を超えるかどうかチェックしています.そうすると、trueを返します.次の関数では、実行中のコンテナーが終了しても安全です.def check_containers():
to_delete = []
for c in client.containers.list():
start_at = c.attrs['State']['StartedAt']
interval = compare_time(STARTING_TIME,start_at)
deleteable = eval_interval(interval)
print(c.name + " (" + c.id + ") " + str(c.image) + " " + str(deleteable))
if deleteable == True:
to_delete.append({"id": c.id, "name": c.name})
else:
continue
return to_delete
この関数は、その値が真であることを検出したコンテナのIDと名前を格納した辞書のリストです.def delete_containers(to_delete):
failed_deletions = []
for c in to_delete:
try:
running_container = str(c['id'])
print("Deleting: " + running_container)
**print(client.stop(container=running\_container))**
except:
failed_deletions.append(c)
print("Failed to delete: " + c.id)
continue
return failed_deletions
これは、削除可能なコンテナのリストを取り込み、削除されない新しいコンテナの独自のリストを作成します(そして、必要に応じて、私は後で再試行の動作において欲しいのですが、今のところ、それはちょうど前に例外をスローします).これらは全て主要な関数で実行される:
def main():
to_delete = check_containers()
delete_expired = delete_containers(to_delete)
return delete_expired
if __name__ == " __main__":
main()
使用するパッケージについては、Reference
この問題について(Docker Python SDKによる実行中のコンテナ寿命の管理), 我々は、より多くの情報をここで見つけました https://dev.to/jmarhee/managing-running-container-lifetimes-with-the-docker-python-sdk-onoテキストは自由に共有またはコピーできます。ただし、このドキュメントのURLは参考URLとして残しておいてください。
Collection and Share based on the CC Protocol