eval
jest powłoką wbudowane, natomiast docker exec
wymaga zewnętrznego narzędzia będzie wywoływana, tak pomocą eval
jest nie rozwiązaniem.
Zamiast wywołać wykonywalny powłoki w pojemniku (bash
) wyraźnie i przekazać mu polecenie, aby wykonać jako ciąg, poprzez jego -c
opcji:
docker exec "app_$i" bash -c "echo 'server.url=$server_url' >> /home/app/.app/app.config"
za pomocą podwójnie -quoted string, aby przejść do bash -c
, upewniając się, że bieżąca wykonuje najpierw interpolację ciągów, podczas gdy instancja kontenera bash
widzi rozszerzony wynik jako literał, jako część wbudowanego , jedno-cytowanego ciągu.
chodzi o objawów:
/home/user/.app/app.config: No such file or directory
odnotowano, ponieważ przekierowanie zamierzałeś zdarzyć w pojemniku faktycznie wydarzyło w skorupkach swojego gospodarza - i dlatego, reż. /home/user/.app
najwyraźniej nie istnieje w systemie plików twojego hosta, polecenie nie powiodło się zasadniczo, przed powłoka hosta próbowała nawet wykonać polecenie (bash
przerwie wykonywanie polecenia, jeśli przekierowanie wyjścia nie może zostać wykonane).
- Tak więc, mimo że pierwsze polecenie zawarte również
eval
, jego zastosowanie nie powierzchniowych jako problem dopóki drugiego polecenia, które faktycznie zrobił zostanie wykonany.
exec: "eval": executable file not found in $PATH
stało, ponieważ, jak stwierdzono, nie jest eval
zewnętrzne narzędzie, ale powłoka wbudowane i docker exec
może wykonać tylko zewnętrznych narzędzi.
Dlaczego '-d' dla execer exec? – user2915097
'eval' nie występuje w kontenerze. Jądro jest dzielone między hostem a kontenerem. Programy nie są. Jeśli zainstalowałeś 'nc' na twoim hoście, kontener nie będzie mógł go uruchomić, dopóki nie zainstalował go w swoim hoście. – Auzias
@Auzias: Problem nie polega na tym, że 'eval' nie jest _present_ w kontenerze (prawdopodobnie jest to _shell wbudowany w powłokę kontenera), ale że _nie jest zewnętrznym narzędziem_, więc' docker exec' nie może wywołać to. – mklement0