web-dev-qa-db-ja.com

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

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

findのみが問題ありません:

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

find with sed

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には表示されません。ドッカーによるものだと思いますが、わかりません。

sedを成功させるには?


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

10
Mithril

はい、わかりました。ファイルは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方法

cat>/tmp/vim-temp-script << EOF 
:set nobackup backupcopy = yes 
:let i = 0 
:while 1 
:let i + = 1 
:%s/10.142.55.199/Host02/g 
:if i> = argc()
:break 
: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'-
10
Bruce

Imho、最も簡単な方法は、Dockerfileで以下を使用することです。

RUN cp /etc/hosts /etc/hosts2 && sed -i 's/::1  localhost/::1/g' /etc/hosts2
CMD cat /etc/hosts2 >> /etc/hosts
0