Ce problème se produit uniquement dans le conteneur Docker.
Seul find
est 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 ls
vois pas. Je pense que c'est par docker, mais je ne peux pas le comprendre.
Comment sed
ré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
?
sed
. Lorsque vous effectuez une modification sur place,sed
cré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 lesed8Ey5tD
fichier?sed
à ne pas créer de fichier de sauvegardexargs sed -i'' "s/10.142.55.199/host02/g"
(ajoutez des guillemets simples juste après la-i
clé)Réponses:
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
sed
avec option-i
cré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.
echo abc > file
cp
, par exemple,cp new old
Donnez-vous plusieurs exemples pour résoudre votre problème:
Le
cp
chemin:Le
vim
cheminLe
ed
cheminla source
À mon humble avis, la méthode la plus simple consiste à utiliser les éléments suivants dans un Dockerfile:
la source