ホームページ >バックエンド開発 >Golang >Docker イメージのロードに失敗しました

Docker イメージのロードに失敗しました

WBOY
WBOY転載
2024-02-13 08:20:091124ブラウズ

Docker イメージのロードに失敗しました

php Editor Strawberry は、Docker を使用するときによくある問題、つまり「Docker イメージのロードに失敗しました」に遭遇することがあります。この問題により、Docker を使用してコンテナーを正常に構築および実行できなくなる可能性があります。ただし、心配しないでください。この問題には通常、複数の解決策があります。この記事では、Docker イメージを正常にロードし、この厄介な問題を解決するのに役立ついくつかの一般的な解決策を紹介します。あなたが初心者であっても、経験豊富な Docker ユーザーであっても、この記事が役立つことを願っています。

質問内容

golangdocker clientを使用して、.tar形式のdockerイメージをロードしています。

リーリー

// 関数: getimageidbyrepotag

リーリー

getimageidbyrepotag 常に fmt.errorf("リポジトリタグ付きイメージ ID: %s"、リポタグが見つかりません) を返します。 また、docker image を実行しても、イメージが読み込まれません。画像の読み込みがまだ終わっていないようです。

私の他のコードでは、Docker クライアント cli.imageload はすぐに戻りますが、Docker イメージのロードには通常時間がかかります。 getimageidbyrepotag をチェックする前に、通常は約 30 秒の待ち時間を追加します。この場合、待ち時間を追加しても役に立ちません。

ありがとうございます

解決策

いくつか質問があります:

  • これら 2 つのゴルーチンは err を共有しているため、一部のエラー処理が失われる可能性があります
    • ここではゴルーチンごとに一意のエラー変数を使用し、wg.wait()
    • の後に両方のエラーをチェックする必要があります。
  • 主な問題: マニフェスト ファイルを見つけてタグ情報を抽出するために tar リーダーから読み取りを行っていますが、これは問題ありませんが、見つかった後は残りのバイト ストリームをパイプの中間にコピーします。 。したがって、docker クライアント
  • に到達しないバイト ストリームの一部が失われることになります。

tar バイト ストリームを 2 回読み取らないようにするには、io.teereader を使用します。 これにより、tar アーカイブを読み取り、manifest ファイルをスキャンするだけでなく、このストリームを完全に別の場所 (つまり、docker クライアント) に書き込むこともできます。

teereader:

を作成します リーリー

画像の読み込みは、(パイプの代わりに) ここから読み取られます:

リーリー

次に、archive/tar リーダーをパイプから読み取るように変更します:

リーリー

その後、io.copy ブロックを削除できます:

リーリー

tar 検査コードはストリーム全体を eof に読み取るためです。

補足事項 どちらかの goroutine からの潜在的なエラーをチェックするときに eof が 1 つであると考えないようにするために、io.eofnil にリセットするとよいでしょう。エラー:

リーリー

以上がDocker イメージのロードに失敗しましたの詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

声明:
この記事はstackoverflow.comで複製されています。侵害がある場合は、admin@php.cn までご連絡ください。