dockerで文字列を見つけてsedすると、「デバイスまたはリソースが使用中です」というエラーが発生します。

dockerで文字列を見つけてsedすると、「デバイスまたはリソースが使用中です」というエラーが発生します。

この問題は Docker コンテナでのみ発生します。

これが唯一のfind方法です。

find ${BASIN_SPIDER_CONFIG_PATH} -type f -name "*.json"

findsedで

find ${BASIN_SPIDER_CONFIG_PATH} -type f -name "*.json"|xargs sed -i "s/10.142.55.199/host02/g"

エラーが発生します。

/xxx/config/sed8Ey5tD: Device or resource busy

私はそれが何であるか理解できず、見ることがsed8Ey5tDできlsません。私はこれがdockerによって書かれたようですが、それを理解することはできません。

成功する方法は何ですかsed


さて、ファイルはdockerによってロールアップされてい volumes: /xxx/config.json : /xxx/config/config.json ますdocker-compose.ymldocker-compose downしかし、そうでない場合は、ファイルをどのように編集しますかdocker-compose down

ベストアンサー1

はい、ご存知のように、ファイルはdockerによってマウントされます。つまり、dockerコンテナ内でそのinodeを変更することはできません。しかし、iノードに触れずにファイルの内容だけを変更すると機能しますか?当然ではない。したがって、新しいファイルを作成してから元のファイルを置き換えるのではなく、元のファイルの内容のみを変更する方法を見つけることができます。

sedオプションを含むコマンドは-i新しいファイルを作成し、古いファイルを新しいファイルに置き換えます。これにより、ファイルinodeが確実に変更されます。そのため、エラーが発生します。

それでは、ファイルの内容を変更するためにどのような方法を使用できますか?非常に多くの方法があります。

  1. たとえば、シェルリダイレクトは次のようになります。echo abc > file
  2. コマンドcp、例えば、cp new old
  3. ウィム
  4. 編集する

以下は、問題を解決する方法のいくつかの例です。

方法cp:

${BASIN_SPIDER_CONFIG_PATH} -type f -name "*.json" |パラメータの検索-L1 bash -c 'sed "s/10.142.55.199/host02/g" $1 > /tmp/.intermediate-file-2431 cp /tmp/.intermediate-file-2431 $1;'

vim道路

猫> /tmp/vim-temp-script <<EOF
:バックアップバックアップコピーなし設定=はい
:私= 0
:同時に1
:私に+ = 1を与える
:%s/10.142.55.199/host02/g
: i >= argc() の場合
:残り
:もしかしたら
:wn
:ついに
:wq
EOF
${BASIN_SPIDER_CONFIG_PATH} -type f -name "*.json" |パラメータの検索vim -s /tmp/vim-temp-script

ed道路

${BASIN_SPIDER_CONFIG_PATH} 検索 -type f -name "*.json"|xargs-L1 bash -c 'ed $1 <<EOF
,s/10.142.55.199/host02/g
ウェッカー
EOF'--

おすすめ記事