la chaîne find et sed dans le docker a reçu l'erreur `Périphérique ou ressource occupé`

10

Ce problème se produit uniquement dans le conteneur Docker.

Seul findest bien:

find ${BASIN_SPIDER_CONFIG_PATH} -type f -name "*.json"

find avec sed

find ${BASIN_SPIDER_CONFIG_PATH} -type f -name "*.json"|xargs sed -i "s/10.142.55.199/host02/g"

donne une erreur:

/xxx/config/sed8Ey5tD: Device or resource busy

Je ne comprends pas ce que c'est sed8Ey5tD, je ne le lsvois pas. Je pense que c'est par docker, mais je ne peux pas le comprendre.

Comment sedréussir?


OK, j'ai trouvé que le fichier était volumineux par docker, il y volumes: /xxx/config.json : /xxx/config/config.json en a docker-compose.yml. Après docker-compose down, le fichier peut être édité. Mais comment puis-je modifier le fichier sans docker-compose down?

Mithril
la source
C'est un fichier temporaire créé par sed. Lorsque vous effectuez une modification sur place, sedcrée un fichier temporaire sur lequel travailler pour éviter de corrompre votre original. Si quelque chose s'est bien passé, il remplace l'original par un temporaire. Mais quelle est ta question? Vous voulez savoir quelle est la cause de cette erreur ou quel est le sed8Ey5tDfichier?
cuonglm
@cuonglm Je veux savoir comment réussir sed.
Mithril
êtes-vous sûr que vous avez des autorisations d'écriture à l'intérieur du conteneur?
user1700494
@ user1700494 utilisateur root
Mithril
vous pouvez essayer de forcer sedà ne pas créer de fichier de sauvegarde xargs sed -i'' "s/10.142.55.199/host02/g"(ajoutez des guillemets simples juste après la -iclé)
user1700494

Réponses:

10

Oui, comme vous l'avez constaté, le fichier est monté par docker, ce qui signifie que vous n'êtes pas autorisé à modifier son inode à partir du conteneur docker. Mais que se passe-t-il si vous modifiez uniquement le contenu du fichier sans toucher à son inode, cela fonctionne-t-il? Bien sûr que oui. Il vous suffit donc de trouver un moyen de modifier uniquement le contenu du fichier d'origine, plutôt que de créer un nouveau fichier, puis de remplacer celui d'origine.

La commande sedavec option -icrée un nouveau fichier, puis remplace l'ancien fichier par le nouveau, ce qui changera définitivement l'inode du fichier. C'est pourquoi cela vous donne l'erreur.

Alors, quelles façons peuvent changer le contenu du fichier? De nombreuses façons.

  1. redirection du shell, par exemple, echo abc > file
  2. commande cp, par exemple,cp new old
  3. vigueur
  4. ed

Donnez-vous plusieurs exemples pour résoudre votre problème:

Le cpchemin:

trouver $ {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; ' -

Le vimchemin

cat> / tmp / vim-temp-script << EOF
: set nobackup backupcopy = yes
: soit i = 0
: tandis que 1
: soit i + = 1
:% s / 10.142.55.199 / host02 / g
: si i> = argc ()
: Pause
: fin si
: wn
: fin
: wq
EOF 
trouver $ {BASIN_SPIDER_CONFIG_PATH} -type f -name "* .json" | xargs vim -s / tmp / vim-temp-script

Le edchemin

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 '-
Bruce
la source
0

À mon humble avis, la méthode la plus simple consiste à utiliser les éléments suivants dans un Dockerfile:

RUN cp /etc/hosts /etc/hosts2 && sed -i 's/::1  localhost/::1/g' /etc/hosts2
CMD cat /etc/hosts2 >> /etc/hosts
Dimitris Moraitidis
la source