Docker Compose メンテナとしての私の日常業務は、新たに報告された問題をチェックし、誤解や潜在的なバグを通じてユーザーを支援することです。問題が非常によく文書化されている場合もあれば、「 助けてください」 というメッセージに過ぎない場合もあります。 そして時々彼らは本当に奇妙に見え、面白い調査につながる可能性があります。 これが私たちがそのようなレポートの1つをどのように解決したかについての話です...
1 行のバグレポート
問題は 「macOSカタリナでドッカー作成が非常に遅い」 と報告されました–バージョンも詳細もありません。 これをどのように優先すればよいですか? レポーターが最新バージョンのツールを使用しているかどうかさえわかりません–未解決の問題はバグレポートテンプレートに従っていません。 これは単なるワンライナーです。 しかし、何らかの理由で、とにかくそれを見て問題を診断することにしました。
超遅さについての明白な説明なしに、私は危険を冒して自分のMacBookをOSXカタリナにアップグレードすることにしました。 docker-compose の実行が大幅に遅くなり、コンソールに最初の行が出力されて無効なコマンドの使用法が表示されるまで数秒待つことができました。
問題の調査
その間、一部のユーザーは、パッケージ化された実行可能ファイルではなく、プレーンなPythonソフトウェアとして docker-compose をインストールすると正しいパフォーマンスが得られると報告しました。 docker-compose 実行可能ファイルは、Python ランタイムとライブラリをアプリケーション コードと共に 1 つの実行可能ファイルに埋め込む PyInstaller を使用してパッケージ化されます。その結果、Windows、Linux、およびOSX用に作成できる配布可能なバイナリが得られます。 私はミニマリストの「hello world」Pythonアプリケーションを作成し、 docker-compose と同じ方法でパッケージ化された同じ奇妙な動作、つまり数秒の起動遅延を再現することができました。
ここに面白い部分があります。 私はDockerチームのリモートワーカーであり、インターネット接続に問題があることがあります。 私のネットワークルーターが再起動しなければならなかったので、それはまさにこの日に起こりました。 そして、再起動シーケンス中に、 ドッカーコンポスeパフォーマンスが突然かなり良くなりました...しかし、最終的には、最初の実行遅延が戻ってきました。 そのようなことをどのように説明しますか?
そこで、ネットワークトラフィックを分析するために チャールズプロキシ をインストールし、 docker-compose が実行されるたびに api.apple-cloudkit.com に送信されたリクエストを発見しました。 Apple Cloudkit は Apple Cloud Storage SDK であり、 docker-compose とこのサービスの間に明確な関係はない。
この期間中、Docker Desktop チームが Catalina のサポートを調査していたとき、Apple OS のアップグレードによって導入された公証の制約について聞きました。 システム整合性チェックを無効にしてシステムを再設定することにしました(起動時にリカバリコンソールから「csrutil disable」を実行する必要があります)。 ここでも、 docker-compose は突然かなり速くなりました。
PyInstallerの実装の詳細を調べると、 docker-compose バイナリを実行すると、それ自体が一時フォルダーに抽出され、埋め込まれたPythonランタイムを実行してパッケージ化されたアプリケーションを実行します。 このブートストラップシーケンスは、tmpフォルダがメモリにマップされている最近のコンピュータでは瞬く間にわかりますが、CatalinaでアップグレードしたMacBookでは、整合性チェックを無効にするまで最大10秒かかりました。
仮説の確認
私の仮定は、OSX Catalinaで強化されたセキュリティ制約は、セキュリティスキャンとして抽出されるPythonランタイムに適用され、システムは独自のクラウドストレージサービスを介してスキャンレポートをAppleに送信します。 そのようなデータをAppleに送信することを承認したことを思い出せませんが、「Catalinaへのアップグレード」ボタンを押す前に、アップグレードガイドとサービス契約を注意深く読んでいなかったことを認めます。 一時的な実行のために新しい新しいPythonランタイムが抽出されると、これはdocker-composeコマンドを実行するたびに発生します:新しいシステムスキャン、アップルに送信される新しいレポート–バックグラウンドタスクとしてではありません。
この仮説を確認するために、代替のPyInstaller構成を使用して docker-compose のカスタムフレーバーを構築したため、単一のバイナリではなく、ランタイムとライブラリを含むフォルダーが作成されます。 このカスタム docker-compose パッケージの最初の実行には再び 10 秒かかりましたが (システムによる最初のスキャン)、後続のコマンドは期待どおりに効率的でした。
解像度
数週間後、リリース候補ビルドがDocker Desktop Edgeチャネルに含まれ、Catalinaユーザーがこの代替パッケージを使用して優れたパフォーマンスを得られることを確認しましたが、予期しないバグは発生しませんでした。 Docker Compose 1.25.1は1か月後にリリースされ 、バグ修正が確認されました。 このリリース以降、 docker-compose は単一のバイナリパッケージと OSX Catalina 用の tar.gz の両方で利用できます。