17

yarn install私のdockerコンテナ内で 実行すると、接続がないという警告が表示されます。https://hub.docker.com/r/tavern/rpg-web/~/dockerfile/

warning You don't appear to have an internet connection. Try the --offline flag to use the cache for registry queries.

何が原因でしょうか?

4

1 に答える 1

16

Dockerfile には読み取り行があるRUN yarn(つまり、yarn のオフライン オプションを使用していない) ため、yarn は、パケットを送信せずに、インターネットが利用可能かどうかを自動的に判断しようとします。

糸はどのようにオンラインステータスをチェックしますか?

os.networkInterfaces()これは、ノードのを使用して docker ビルダー コンテキストで利用可能なネットワーク インターフェイスを列挙することによって行われます

GetInterfaceAddressesこれは、libuv によってサポートされている呼び出しを順番に呼び出しますuv_interface_addresses。libuv 関数は、IP アドレスが割り当てられ、IFF_UPおよびIFF_RUNNINGフラグが設定されているインターフェースのみを返します。

どのアドレスが実際に Javascript コードに返されているかを確認するには、Dockerfile に次の行を一時的に追加します。

RUN node -e 'const os = require("os"); const interfaces = os.networkInterfaces(); for (const interface in interfaces) {console.log(interface); const addrs = interfaces[interface]; for (const addr of addrs) {console.log(addr.address)}}'

少なくとも私の場合、これは糸が1で明示的に無視するループバックアドレスのみを返しました:

lo 127.0.0.1 ::1

しかしifconfig、docker イメージで実行すると、eth0インターフェースも表示されました。このインターフェイスのは、docker デーモンを実行しているマシンHWaddrのインターフェイスのそれと一致します。docker0これは、ビルダー コンテキストが docker bridge ネットワークで実行されていることを示しています。

では、libuv のリストからブリッジ ネットワークを除外する基準は何ですか?

私の場合、docker ネットワークは設定されませんでしたIFF_RUNNINGLinux のドキュメントでは、このフィールドは下位互換性のためのものであると述べているため、これはそれほど驚くべきことではありません。

インスタンスがこれに該当することを確認するには、このドキュメントのサンプル プログラムを少し変更したバージョンを使用し、最初のprintf()呼び出しの後に次のコードを追加します。

printf("RUNNING: %s", (ifa->ifa_flags & IFF_RUNNING) ? "TRUE" : "FALSE");

docker の設定がないのはなぜIFF_RUNNINGですか?

インターフェイス フラグの設定は、docker 自体が処理しない低レベルの操作です。Docker の libnetwork はここで netlink ライブラリに委譲しますが、netlink は設定するIFF_UPだけです。

どうすれば修正できますか?

この問題に関連する可動部分はオープン ソースです。

netlink は、読み取り用に公開するように変更されIFF_RUNNINGました。netlink をさらに変更することで、libnetwork (および docker) がそのフラグを設定できるようになる可能性があります。

あるいは、件名に関する Github の問題に続いて libuv が拡張される可能性があります。IFF_RUNNINGこのような新しい API は、割り当てられた IP アドレスと状態に関係なくインターフェイスをリストする node.js と yarn で最終的に使用される可能性があります。

于 2016-11-21T00:37:39.643 に答える