Sim, como você descobriu, o arquivo é montado pela janela de encaixe, o que significa que você não tem permissão para alterar seu inode a partir do contêiner do Docker. Mas, e se você apenas alterar o conteúdo do arquivo sem tocar em seu inode, isso funciona? Claro que sim. Então, tudo que você precisa fazer é encontrar uma maneira de alterar o conteúdo do arquivo original apenas, em vez de criar um novo arquivo e depois substituir o original.
O comando sed com a opção -i cria um novo arquivo e substitui o arquivo antigo pelo novo, o que definitivamente alterará o arquivo inode. É por isso que você recebe o erro.
Então, quais maneiras podem alterar o conteúdo do arquivo? Muitas e muitas maneiras.
- redirecionamento de shell, por exemplo,
echo abc > file - comando
cp, por exemplo,cp new old - vim
- ed
Dê-lhe vários exemplos de como corrigir o seu problema:
A maneira 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;' --
O vim way
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
find ${BASIN_SPIDER_CONFIG_PATH} -type f -name "*.json" | xargs vim -s /tmp/vim-temp-script
O ed way
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' --