Esse problema ocorre apenas no contêiner de docker.
Só find
está bem:
find ${BASIN_SPIDER_CONFIG_PATH} -type f -name "*.json"
find
com sed
find ${BASIN_SPIDER_CONFIG_PATH} -type f -name "*.json"|xargs sed -i "s/10.142.55.199/host02/g"
dá um erro:
/xxx/config/sed8Ey5tD: Device or resource busy
Não entendo o que é sed8Ey5tD
, ls
não consigo ver. Eu acho que é por docker, mas não consigo descobrir.
Como fazer sed
sucesso?
OK, descobri que arquivo está sendo volumed pela janela de encaixe, existe volumes: /xxx/config.json : /xxx/config/config.json
no docker-compose.yml
. Depois docker-compose down
, o arquivo pode ser editado. Mas como edito o arquivo sem docker-compose down
?
sed
. Quando você faz uma modificação no local,sed
cria um arquivo temporário para trabalhar, a fim de impedir a corrupção do original. Se algo der certo, substitua o original por outro temporário. Mas qual é a sua pergunta? Você quer saber qual causa esse erro ou o que é umsed8Ey5tD
arquivo?sed
a fazer nenhum arquivo de backupxargs sed -i'' "s/10.142.55.199/host02/g"
(adicionar aspas simples logo após-i
key)Respostas:
Sim, como você encontrou, 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 da janela de encaixe. Mas, e se você apenas alterar o conteúdo do arquivo sem tocar no seu inode, ele funciona? Claro que sim. Portanto, tudo o que você precisa fazer é encontrar uma maneira de alterar apenas o conteúdo do arquivo original, em vez de criar um novo arquivo e 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 mudará o inode do arquivo. É por isso que lhe dá o erro.Então, de que maneira pode alterar o conteúdo do arquivo? De muitas maneiras.
echo abc > file
cp
, por exemplo,cp new old
Dê vários exemplos de como corrigir seu problema:
O
cp
caminho:O
vim
caminhoO
ed
caminhofonte
No entanto, a maneira mais fácil de fazer é usar o seguinte em um Dockerfile:
fonte