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

Mit*_*ril 11 sed find xargs docker

这个问题只发生在 docker 容器中。

只有find

find ${BASIN_SPIDER_CONFIG_PATH} -type f -name "*.json"
Run Code Online (Sandbox Code Playgroud)

find 与 sed

find ${BASIN_SPIDER_CONFIG_PATH} -type f -name "*.json"|xargs sed -i "s/10.142.55.199/host02/g"
Run Code Online (Sandbox Code Playgroud)

给出一个错误:

/xxx/config/sed8Ey5tD: Device or resource busy
Run Code Online (Sandbox Code Playgroud)

我不明白是什么sed8Ey5tDls看不到它。我认为是 docker 造成的,但无法弄清楚。

如何取得sed成功?


好的,我发现文件正在被 docker 卷, volumes: /xxx/config.json : /xxx/config/config.jsondocker-compose.yml. 之后docker-compose down,就可以编辑文件了。但是我如何在没有 的情况下编辑文件docker-compose down

Bru*_*uce 12

是的,正如您发现的,该文件是由 docker 挂载的,这意味着您不能从 docker 容器内更改其 inode。但是,如果您只更改文件的内容而不触及其 inode,会怎样呢?当然,确实如此。所以你需要做的就是找到一种方法只改变原始文件的内容,而不是创建一个新文件然后替换原来的文件。

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

那么,有哪些方法可以改变文件的内容呢?许多许多方式。

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

给你几个例子来说明如何解决你的问题:

cp方式:

find ${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
:让我 = 0
:虽然 1
: 让我 += 1
: %s/10.142.55.199/host02/g
: 如果我 >= argc()
: 休息
: 万一
:wn
:endwhile
:wq
EOF 
find ${BASIN_SPIDER_CONFIG_PATH} -type f -name "*.json" | xargs vim -s /tmp/vim-temp-script

ed方法

find ${BASIN_SPIDER_CONFIG_PATH} -type f -name "* .json "|xargs -L1 bash -c 'ed $1 <<EOF
,s/10.142.55.199/host02/g
wq
EOF'--


wil*_*321 5

sed有一个-c使用 with 的选项-i,以便它进行复制而不是移动,这使得这项工作可行。

这有效:

RUN sed -ci "s/localhost/foobar/g" /etc/hosts
Run Code Online (Sandbox Code Playgroud)

但请仔细注意,这sed -ic不会起作用,因为它会生成以 结尾的备份文件.c,而不是执行“what sed -i -c”或“ sed -cidoes”。

今天通过这次学习清理了一个 docker 脚本:)

  • 您使用什么版本的 sed?我的版本 GNU sed 4.7 没有“c”选项。 (13认同)