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' --