Docker Python SDKによる実行中のコンテナ寿命の管理


私は最近サービスを構築し始めました、ユーザー要求に関して、コンテナを作成してください(サービスを提供するために、コンテナ- a - A - Service - style Workloadでありません)、そして、1 - 3時間後に、容器(ユーザのセッションとローカルデータをそれと取り去ります)を終えてください.そのためには、
  • コンテナのstartedatタイムスタンプを取得する
  • タイムスタンプを比較してください.
  • コンテナがその制限を超えている場合、それは停止された状態でキューに入れられ、その後画像を剪定する
  • スクリプトの設定は以下のようになります.
    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()
    
    使用するパッケージについては、
  • dateparser - python parser for human readable dates - DateParser 1.0.0 documentation
  • Docker SDK for Python