Shell: docker コンテナがあることを確認する

Shell: docker コンテナがあることを確認する

このような場合、bashスクリプトでどのように確認しますか?

sudo docker images -q nginx

コンテナがすでに存在することを意味する結果文字列を提供します。

sudo docker images -q nginx
if [ $? != '' ]
then
    echo "existing"
else
    echo "missing

答え1

「Best Answer」で提案したように試みたが、コンテナのIDではなく画像のIDのみを返します。コンテナが実行されているかどうかにかかわらず、常にイメージIDを返します。docker images -q "{Image Name}"

コンテナが実行されていることを確認するには、次のコマンドを適用する必要があります。

Docker ps -q -f名前="{コンテナ名}

コンテナが存在し、実行中の場合はコンテナIDを返します。存在しないか存在するが停止した場合は、空の文字列が返されます。すべての(実行中および停止した)コンテナを検索するには、次のように "docker ps"コマンドに "-a"パラメータを使用します。

Docker ps -a -q -f名前="{コンテナ名}

コンテナIDなどの他のフィールドで検索することもできます。

Docker ps -a -q -f id="{コンテナID}

詳細については、次を参照してください。公式「docker ps」ドキュメント

答え2

$?文字列ではありませんが、sudoこの場合は終了状態です。正しく使用するには、0と比較するか-gt(またはなどの算術評価を実行するシェルでif (( $? )))使用してください。bashksh93(( ... ))

コンテナイメージが存在する場合は文字列を返しsudo docker images -q nginx、存在しない場合は何も返しません。その後、変数を保存して空であることを確認できます。

result=$( sudo docker images -q nginx )

if [[ -n "$result" ]]; then
  echo 'Container image exists'
else
  echo 'No such container image'
fi

ただし、ツールには通常パスワードの対話型プロンプトが必要なため、スクリプト内で使用するのは面倒で、スクリプト自体を実行するためにそれを使用する方が良いでしょうsudo。その後、他のユーザーのIDを想定する必要がある場合にのみ、スクリプト内で使用することをお勧めします。ルート以外のユーザー)。sudosudo

docker inspectコンテナ情報を確認する別のコマンド:

docker inspect -f '{{.Config.Image}}' nginx

これにより、コンテナのコンテナイメージハッシュが提供されますnginx。また、コンテナが存在することを確認するために使用できる正しい終了ステータスを返します。

if docker inspect -f '{{.Config.Image}}' nginx >/dev/null 2>&1
then
    echo 'Container image exists'
else
    echo 'Container does not exist'
fi

または、出力文字列を選択して空であることを確認できます。

result=$( docker inspect -f '{{.Config.Image}}' nginx 2>/dev/null )

if [[ -n "$result" ]]; then
  echo 'Container image exists'
else
  echo 'No such container image'
fi

/dev/nullコンテナイメージが存在しないと文句を言うので、標準エラーストリームをリダイレクトして廃棄しました。

docker inspect次のことを確認して、コンテナが実行中であることを確認することもできます{{.State.Running}}

result=$( docker inspect -f '{{.State.Running}}' nginx )

if [[ $result == "true" ]]; then
  echo 'Container is running'
else
  echo 'Container is not running'
fi

答え3

この試み

sudo docker inspect --format="{{.State.Running}}" $CONTAINER
# If the $CONTAINER is running or not and exists, $? is 0
# But If the $CONTAINER doesn't exist or was never created,
# $? is 1 on docker, or 125 on podman 
if [ $? -eq 0 ];
then
     echo "existing"
else
     echo "missing"
fi

関連情報