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

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

这个问题只发生在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成功?


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

答案1

是的,正如您所发现的,该文件是由 docker 挂载的,这意味着您不允许从 docker 容器内更改其 inode。但是,如果您只更改文件的内容而不触及其 inode,它会起作用吗?当然,确实如此。因此,您需要做的就是找到一种方法来仅更改原始文件的内容,而不是创建一个新文件然后替换原始文件。

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

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

  1. shell 重定向,例如,echo abc > file
  2. 命令cp,例如,cp new old
  3. 维姆
  4. 编辑

举几个例子来说明如何解决您的问题:

道路cp

查找 ${BASIN_SPIDER_CONFIG_PATH} -type f -name "*.json" |参数-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
:设置 nobackup 备份复制=是
:让我= 0
:同时 1
:让我+= 1
:%s/10.142.55.199/host02/g
:如果我 >= argc()
: 休息
: 万一
:wn
:最后
:wq
EOF
查找 ${BASIN_SPIDER_CONFIG_PATH} -type f -name "*.json" |参数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
瓦克
EOF'--

答案2

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

这有效:

RUN sed -ci "s/localhost/foobar/g" /etc/hosts

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

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

答案3

恕我直言,最简单的方法是在 Dockerfile 中使用以下内容:

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

相关内容