Docker、ホストのオペレーティングシステムを検出する

Docker、ホストのオペレーティングシステムを検出する

Docker を使用して Web アプリの開発セットアップを作成しています。開発者は Windows、Mac、Linux で作業しています。全員が Linux コンテナーを使用する予定ですが、Windows ユーザーにのみ影響する問題がまだあります。

アプリケーションを本番環境とは異なる方法で実行したいわけではありません。むしろ、開発者のセットアップに関するツールを変更する必要があります。

Docker コンテナ内からホストのオペレーティング システムを検出する方法はありますか?

答え1

本当にこれをやりたいですか?

フレームチャレンジの回答にご満足いただけないのは承知していますが、どうかご容赦ください。

あなたが直面している問題は、Windows 上で Linux ベースの Docker を実行することがハックであるために発生します。確かに Windows ファイルシステムの問題が発生する可能性はありますが、私が知らない他の問題がある可能性もあります。

さて、私が理解しているとおり、プロジェクトにプラットフォーム固有の回避策を追加して、Windows ホスト上の VM で実行できるようにしたいとお考えのようです。私の経験からすると、これは避けることをお勧めします。

  1. Windows はプロジェクトのターゲット プラットフォームではありません。Windows 固有の問題に対するソリューションを追加すると、不必要な複雑さが生じます。不必要な複雑さは、メンテナンス コストの増加と、そうでなければ発生しないバグの可能性を意味します。

  2. 厳密にはプロジェクトの問題ではないものの、Windows では不要な面倒を生じさせる、ファイルシステムの非互換性によって引き起こされる問題に遭遇する可能性が非常に高くなります。たとえば、大文字と小文字を区別するファイルシステム (Linux など) で誰かが大文字と小文字のみのファイル名の変更を行い、別の人がその変更を Windows マシンにプルすると、git は機能しなくなります。

本当の解決策は、可能な限り意図した環境に近い環境で開発することです。つまり、実際の Linux ホストまたは Linux VM で開発することです。これにより、開発者は開発プラットフォームにのみ存在する問題に時間 (および費用) を無駄にすることがなくなります。また、Windows では発生しない問題を見逃すこともなくなります。

顧客は、製品が Windows 上の Linux VM で正常に動作するかどうかを気にしません。Linux を唯一のプラットフォームとしてターゲットにしているため、開発者は Linux に精通している必要があります。現実のシナリオには存在しない問題に本当にリソースを費やしたいですか?

答え2

私もまったく同じ問題を抱えていました。当社の Angular Web 開発フローは、マップされたボリューム上の webpack で検出されたファイルの変更に依存しています。

fsevents残念ながら、Windowsはファイルシステムイベント( NPMインストール時に常に警告するパッケージ)を渡しません。

答え3

macOS または任意の OS の場合、開発者はローカル シェル プロファイルでこれを設定することができます。

export IS_HOST_MACOS='true'
export HOST_UNAME=$(uname)

次に、次の方法で docker に渡します。

docker run -e IS_HOST_MACOS -i HOST_UNAME

最後に、これを Docker スクリプト内で使用します。

# This is meant to help developers know when the server has booted
if [ -n "${IS_HOST_MACOS+1}" ]; then
  [ "$IS_HOST_MACOS" == "true" ] && echo '{"Nginx is ready":""}';
fi

答え4

コンテナーはシミュレートされた環境で実行されるため、提供される仮想ハードウェアによって Windows ホストと Linux ホストを区別できる場合があります。

例えば、 この答え Windows 上の Docker は、「vEthernet (DockerNAT)」と呼ばれるネットワーク デバイスを作成すると推測します。

テスト環境がないので、自分の環境に適した解決策を見つけるのはあなた次第です。

関連情報