find and sed string im Docker hat den Fehler "Gerät oder Ressource beschäftigt" erhalten

10

Dieses Problem tritt nur im Docker-Container auf.

Nur findist 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, lskann es nicht sehen. Ich denke, es ist von Docker, kann es aber nicht herausfinden.

Wie kann man sedErfolg 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 downkann die Datei bearbeitet werden. Aber wie bearbeite ich die Datei ohne docker-compose down?

Mithril
quelle
Es ist eine temporäre Datei, die von erstellt wurde sed. Wenn Sie direkt Änderungen vornehmen, sedwird 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 eine sed8Ey5tDDatei ist?
Cuonglm
@cuonglm Ich möchte wissen, wie man sed Erfolg macht.
Mithril
Sind Sie sicher, dass Sie Schreibberechtigungen im Container haben?
user1700494
@ user1700494 root user
Mithril
Sie können versuchen, zu erzwingen sed, keine Sicherungsdatei zu erstellen xargs sed -i'' "s/10.142.55.199/host02/g"(einfache Anführungszeichen direkt nach dem -iSchlüssel hinzufügen )
user1700494

Antworten:

10

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 sedmit Option -ierstellt 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.

  1. Shell-Weiterleitung, z. echo abc > file
  2. Befehl cp, z.cp new old
  3. vim
  4. ed

Geben Sie einige Beispiele zur Behebung Ihres Problems:

Der cpWeg:

find $ {BASIN_SPIDER_CONFIG_PATH} -Typ 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; ' - -

Der vimWeg

cat> / tmp / vim-temp-script << EOF
: setze nobackup backupcopy = yes
: sei i = 0
: während 1
: sei i + = 1
:% s / 10.142.55.199 / host02 / g
: wenn i> = argc ()
: brechen
: endif
: wn
: Endlich
: wq
EOF 
find $ {BASIN_SPIDER_CONFIG_PATH} -Typ f -name "* .json" | xargs vim -s / tmp / vim-temp-script

Der edWeg

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

Imho, der einfachste Weg ist, Folgendes in einer Docker-Datei zu verwenden:

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