dockerで文字列を検索してsedするとエラー「デバイスまたはリソースがビジーです」が発生する


10

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

だけfindで結構です。

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

find セッド付き

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

何なのか分からないsed8Ey5tDls見えない。港湾労働者によるものだと思いますが、わかりません。

sed成功する方法は?


OK、ファイルがdockerによってボリューム化されていることがわかり volumes: /xxx/config.json : /xxx/config/config.json ましたdocker-compose.yml。その後docker-compose down、ファイルを編集できます。しかし、どうすればファイルを編集できますdocker-compose downか?


によって作成された一時ファイルですsed。インプレース変更をsed行うと、オリジナルの破損を防ぐために作業する一時ファイルが作成されます。何かがうまくいけば、オリジナルを一時的なものに置き換えます。しかし、あなたの質問は何ですか?あなたはそのエラーの原因またはsed8Ey5tDファイルは何であるか知りたいですか?
cuonglm 2017年

@cuonglm sedを成功させる方法を知りたい。
ミスリル

コンテナ内に書き込み権限があることを確認していますか?
user1700494 2017年

@ user1700494 rootユーザー
Mithril

sedバックアップファイルを作成しないように強制することができますxargs sed -i'' "s/10.142.55.199/host02/g"-iキーの直後に一重引用符を追加します)
user1700494

回答:


10

はい、わかりました。ファイルはdockerによってマウントされています。つまり、Dockerコンテナー内からiノードを変更することはできません。しかし、inodeを変更せずにファイルのコンテンツのみを変更するとどうなるでしょうか。もちろんです。つまり、新しいファイルを作成して元のファイルを置き換えるのではなく、元のファイルの内容のみを変更する方法を見つけるだけです。

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

では、どのようにしてファイルの内容を変更できますか?多くの方法。

  1. シェルリダイレクト、例えば、 echo abc > file
  2. コマンドcp、例えばcp new old
  3. vim
  4. ed

問題を修正する方法の例をいくつか示します。

cp道:

$ {BASIN_SPIDER_CONFIG_PATH}を見つけます-type f -name "* .json" | xargs -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
:set nobackup backupcopy = yes
:let i = 0
:一方、1
:i + = 1とする
:%s / 10.142.55.199 / host02 / g
:i> = argc()の場合
:休憩
:endif
:wn
:endwhile
:wq
EOF 
は$ {BASIN_SPIDER_CONFIG_PATH}を見つけます-type f -name "* .json" | xargs 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
wq
EOF '-

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.