localizar e sed string no docker tem erro 'Dispositivo ou recurso ocupado'

2

Esse problema ocorre apenas no contêiner docker.

Apenas find é bom:

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"

apresenta um erro:

/xxx/config/sed8Ey5tD: Device or resource busy

Eu não entendo o que é sed8Ey5tD , ls não pode vê-lo. Eu acho que é pelo docker, mas não consigo descobrir.

Como fazer sed sucesso?

OK, descobri que o arquivo está sendo incluído pela janela de encaixe, há volumes: /xxx/config.json : /xxx/config/config.json in docker-compose.yml . Depois de docker-compose down , o arquivo pode ser editado. Mas como edito o arquivo sem docker-compose down ?

    
por Mithril 13.11.2017 / 09:36

1 resposta

2

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.

  1. redirecionamento de shell, por exemplo, echo abc > file
  2. comando cp , por exemplo, cp new old
  3. vim
  4. 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' --
    
por 14.11.2017 / 01:58