O comando find e sed string no docker obteve o erro `Dispositivo ou recurso ocupado`


10

Esse problema ocorre apenas no contêiner de docker.

findestá 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, lsnão consigo ver. Eu acho que é por docker, mas não consigo descobrir.

Como fazer sedsucesso?


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?


É um arquivo temporário criado por sed. Quando você faz uma modificação no local, sedcria 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 é um sed8Ey5tDarquivo?
cuonglm

@cuonglm Quero saber como fazer sucesso com sed.
Mithril

tem certeza de que possui permissões de gravação dentro do contêiner?
user1700494

@ user1700494 usuário root
Mithril

você pode tentar forçar seda fazer nenhum arquivo de backup xargs sed -i'' "s/10.142.55.199/host02/g"(adicionar aspas simples logo após -ikey)
user1700494

Respostas:


10

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 sedcom a opção -icria 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.

  1. redirecionamento de shell, por exemplo, echo abc > file
  2. comando cp, por exemplo,cp new old
  3. vim
  4. ed

Dê vários exemplos de como corrigir seu problema:

O cpcaminho:

encontre $ {BASIN_SPIDER_CONFIG_PATH} -tipo 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 vimcaminho

cat> / tmp / vim-temp-script << EOF
: defina nobackup backupcopy = yes
: deixe i = 0
: enquanto 1
: deixe i + = 1
:% s / 10.142.55.199 / host02 / g
: se i> = argc ()
: quebrar
: fim se
: wn
: final enquanto
: wq
EOF 
localizar $ {BASIN_SPIDER_CONFIG_PATH} -tipo f -name "* .json" | xargs vim -s / tmp / vim-temp-script

O edcaminho

localizar $ {BASIN_SPIDER_CONFIG_PATH} -tipo f -name "* .json" | xargs -L1 bash -c 'ed $ 1 << EOF
, s / 10.142.55.199 / host02 / g
wq
EOF '-

0

No entanto, a maneira mais fácil de fazer é usar o seguinte em um Dockerfile:

RUN cp /etc/hosts /etc/hosts2 && sed -i 's/::1  localhost/::1/g' /etc/hosts2
CMD cat /etc/hosts2 >> /etc/hosts
Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.