这个问题只发生在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
我不明白是什么sed8Ey5tD
,ls
看不到它。我认为这是由 docker 编写的,但无法弄清楚。
如何取得sed
成功?
好的,我发现该文件正在被 docker 卷取, volumes: /xxx/config.json : /xxx/config/config.json
在docker-compose.yml
.之后docker-compose down
,就可以编辑该文件了。但是如果没有 ,我该如何编辑文件呢docker-compose down
?
答案1
是的,正如您所发现的,该文件是由 docker 挂载的,这意味着您不允许从 docker 容器内更改其 inode。但是,如果您只更改文件的内容而不触及其 inode,它会起作用吗?当然,确实如此。因此,您需要做的就是找到一种方法来仅更改原始文件的内容,而不是创建一个新文件然后替换原始文件。
sed
带选项的命令-i
会创建新文件,然后用新文件替换旧文件,这肯定会更改文件 inode。这就是为什么它会给你错误。
那么,有哪些方法可以改变文件的内容呢?很多很多方式。
- shell 重定向,例如,
echo abc > file
- 命令
cp
,例如,cp new old
- 维姆
- 编辑
举几个例子来说明如何解决您的问题:
道路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 -c
或sed -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