在docker中查找和sed字符串时出现错误`设备或资源繁忙'


10

此问题仅在docker容器中发生。

find是罚款:

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

find 与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

我不明白是什么sed8Ey5tDls看不到。我认为这是由docker造成的,但无法解决。

如何取得sed成功?


好吧,我发现这个文件是由搬运工volumed,有 volumes: /xxx/config.json : /xxx/config/config.jsondocker-compose.yml。之后docker-compose down,可以编辑文件。但是,如何在没有文件的情况下编辑文件docker-compose down


这是由创建的临时文件sed。在进行就地修改时,sed将创建一个临时文件以防止损坏您的原始文件。如果一切正常,则将其替换为临时的。但是你有什么问题呢?您想知道导致该错误的原因或sed8Ey5tD文件是什么?
cuonglm '17

@cuonglm我想知道如何使sed成功。
秘银

您确定您在容器内具有写权限吗?
user1700494

@ user1700494 root用户
Mithril

您可能会尝试强制sed不制作任何备份文件xargs sed -i'' "s/10.142.55.199/host02/g"(在-i密钥后添加单引号)
user1700494

Answers:


10

是的,正如您所发现的,该文件是由docker挂载的,这意味着不允许您从docker容器中更改其inode。但是,如果仅更改文件内容而不接触文件的inode怎么办?当然可以。因此,您需要做的就是找到一种仅更改原始文件内容的方法,而不是创建一个新文件然后替换原始文件。

sed带option的命令-i会创建一个新文件,然后用新文件替换旧文件,这肯定会更改文件inode。这就是为什么它会给您错误。

那么,哪些方法可以更改文件的内容?很多很多的方式。

  1. 外壳重定向,例如 echo abc > file
  2. 命令cp,例如cp new old
  3. vim

举例说明如何解决您的问题:

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 =是
:让我= 0
:同时1
:让我+ = 1
:%s / 10.142.55.199 / host02 / g
:如果我> = argc()
:休息
: 万一
:wn
:结束
: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
q
EOF'-

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.