この問題は、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.json
はdocker-compose.yml
にあります。 docker-compose down
の後、ファイルを編集できます。しかし、docker-compose down
なしでファイルを編集するにはどうすればよいですか?
はい、わかりました。ファイルはdockerによってマウントされています。つまり、Dockerコンテナー内からiノードを変更することはできません。しかし、inodeを変更せずにファイルのコンテンツのみを変更するとどうなるでしょうか。もちろんです。新しいファイルを作成して元のファイルを置き換えるのではなく、元のファイルの内容のみを変更する方法を見つけるだけです。
コマンドsed
とオプション-i
は新しいファイルを作成し、古いファイルを新しいファイルで置き換えます。これにより、ファイルのiノードが確実に変更されます。そのため、エラーが発生します。
それでは、どの方法でファイルのコンテンツを変更できますか?多くの方法。
echo abc > file
cp
、例:cp new old
問題を修正する方法の例をいくつか示します。
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'-
Imho、最も簡単な方法は、Dockerfileで以下を使用することです。
RUN cp /etc/hosts /etc/hosts2 && sed -i 's/::1 localhost/::1/g' /etc/hosts2
CMD cat /etc/hosts2 >> /etc/hosts