Dieses Problem tritt nur im Docker-Container auf.
Nur find
ist in Ordnung:
find ${BASIN_SPIDER_CONFIG_PATH} -type f -name "*.json"
find
mit sed
find ${BASIN_SPIDER_CONFIG_PATH} -type f -name "*.json"|xargs sed -i "s/10.142.55.199/host02/g"
gibt einen Fehler:
/xxx/config/sed8Ey5tD: Device or resource busy
Ich verstehe nicht was ist sed8Ey5tD
, ls
kann es nicht sehen. Ich denke, es ist von Docker, kann es aber nicht herausfinden.
Wie kann man sed
Erfolg haben?
OK, ich fand , dass Datei von Docker volumed wird, gibt es volumes: /xxx/config.json : /xxx/config/config.json
in docker-compose.yml
. Danach docker-compose down
kann die Datei bearbeitet werden. Aber wie bearbeite ich die Datei ohne docker-compose down
?
sed
. Wenn Sie direkt Änderungen vornehmen,sed
wird eine temporäre Datei erstellt, an der gearbeitet werden kann, um eine Beschädigung Ihres Originals zu vermeiden. Wenn etwas richtig gelaufen ist, wird das Original durch ein temporäres ersetzt. Aber was ist deine Frage? Sie möchten wissen, welche Ursache dieser Fehler ist oder was einesed8Ey5tD
Datei ist?sed
, keine Sicherungsdatei zu erstellenxargs sed -i'' "s/10.142.55.199/host02/g"
(einfache Anführungszeichen direkt nach dem-i
Schlüssel hinzufügen )Antworten:
Ja, wie Sie festgestellt haben, wird die Datei vom Docker bereitgestellt. Dies bedeutet, dass Sie den Inode nicht innerhalb des Docker-Containers ändern dürfen. Aber was funktioniert, wenn Sie nur den Inhalt einer Datei ändern, ohne deren Inode zu berühren? Sicher, das tut es. Sie müssen also nur einen Weg finden, um nur den Inhalt der Originaldatei zu ändern, anstatt eine neue Datei zu erstellen und dann die Originaldatei zu ersetzen.
Der Befehl
sed
mit Option-i
erstellt eine neue Datei und ersetzt dann die alte Datei durch die neue, wodurch sich der Datei-Inode definitiv ändert. Deshalb gibt es Ihnen den Fehler.Wie kann der Inhalt einer Datei geändert werden? Viele, viele Möglichkeiten.
echo abc > file
cp
, z.cp new old
Geben Sie einige Beispiele zur Behebung Ihres Problems:
Der
cp
Weg:Der
vim
WegDer
ed
Wegquelle
Imho, der einfachste Weg ist, Folgendes in einer Docker-Datei zu verwenden:
quelle