eval
ist ein Shell gebautet, während docker exec
erfordert ein externes Dienstprogramm aufgerufen werden, so dass unter Verwendung von eval
ist nicht eine Option.
Stattdessen aufrufen, um eine Schale ausführbare im Behälter (bash
) explizit, und sie den Befehl übergeben als Zeichenfolge über seine -c
Option auszuführen:
docker exec "app_$i" bash -c "echo 'server.url=$server_url' >> /home/app/.app/app.config"
Durch die Verwendung eines Doppel -0,Zeichenfolge, die an bash -c
übergeben wird, stellen Sie sicher, dass die Shell zuerst die Zeichenfolgeninterpolation ausführt, während die bash
Instanz des Containers das erweiterte Ergebnis alsanzeigtLiteral, als Teil der eingebetteten einfach zitierten Zeichenfolge.
Was Ihre Symptome:
/home/user/.app/app.config: No such file or directory
berichtet wurde, weil die Umleitung Sie im Behälter tatsächlich passiert ist in Ihrem Host-Shell passieren soll - und weil Richt. /home/user/.app
offenbar existiert nicht in Dateisystem Ihres Hosts, konnte der Befehl grundsätzlich, vor Shell Ihren Hosts selbst den Befehl (bash
wird abgebrochen, Befehlsausführung, wenn eine Umleitung der Ausgabe nicht durchgeführt werden kann) auszuführen versucht.
- So, auch wenn Sie Ihre erste Befehl enthielt auch
eval
, hat seine Verwendung nicht als Problem, bis der zweite Befehl Oberfläche, die tatsächlich tat ausgeführt werden sollen.
exec: "eval": executable file not found in $PATH
passiert ist, weil, wie gesagt, eval
kein externes Dienstprogramm ist, sondern eine Schale gebautet und docker exec
können nur externe Dienstprogramme ausführen.
Warum '-d' für docker exec? – user2915097
'eval' ist nicht im Container vorhanden. Der Kernel wird vom Host und dem Container gemeinsam genutzt. Die Programme sind nicht. Wenn Sie 'nc' auf Ihrem Host installiert haben, kann der Container sie nicht ausführen, solange er nicht darin installiert wurde. – Auzias
@Auzias: Das Problem ist nicht, dass 'eval' nicht _present_ im Container ist (es ist wahrscheinlich, als _Shell builtin_ der Shell des Containers), aber es ist _not ein externes Dienstprogramm_, so' docker exec' kann nicht aufgerufen werden es. – mklement0