bashスクリプトでdockerなのかホストなのかを確認するには?

bashスクリプトでdockerなのかホストなのかを確認するには?

Dockerコンテナ用のシェルスクリプトを作成しています。
スクリプトを実行する前に、Dockerコンテナかホストかを確認したいと思います。

このような:

if $MACHINE=docker; then
   echo proceed
elif $MACHINE=host; then
   echo 'it's not container'
   exit
fi

答え1

dockerに属する制御グループがあることを確認できます。

if grep -q docker /proc/1/cgroup; then 
   echo inside docker 
else
   echo on host
   exit
fi

答え2

が利用可能で、virt-whatDockerを認識します。 Debian とその派生物、または Red Hat とその派生物でそれぞれ使用またはapt install virt-whatインストールできます。yum install virt-what戻りコードが0でエラーがない場合、マシンは物理マシンまたは認識できない仮想マシンタイプです。港湾労働者が戻ってきますdocker

仮想的に検出されたプラットフォーム

答え3

これはcgroup 2.0では機能せず、MacのDocker Desktopでも機能しません。

root@8a1d175a0b6c:/# cat /proc/self/cgroup

0::/

Linuxのルートファイルシステムにファイルがある場合は、/.dockerenvDockerコンテナ内で実行されているかどうかを知るためのより信頼性の高い方法ですが、これはコンテナIDを提供せず、空のファイルです。

あまり脆弱な方法が必要

  1. コンテナで実行しているときを検出し、
  2. 独自のコンテナIDを取得します。

Dockerチームはここで本当に失敗しました。少なくともコンテナIDを入力する必要があります/.dockerenv

関連情報