2015-12-24 15 views
6

muszę wiedzieć, w moim skrypcie wyjście niektórych poleceń doker Exec na przykład mam pojemnik nginx i moim skrypcie biegnę:Wynik polecenia exec Döcker

docker exec -it containerName /etc/init.d/nginx configtest

chcę aby kontynuować wykonywanie skryptu tylko wtedy, gdy test konfiguracyjny nginxa zakończy się sukcesem, a nie niepowodzeniem.

Próbowałem użyć , ale jest to 0, nawet wtedy wyjście configtest nie działa (ponieważ program Docker jest pomyślnie wykonany, jak rozumiem).

+1

'doker Exec -to mynginx /etc/init.d/nginx configtest' powraca' 1 'dla mnie, czy istnieje jakikolwiek błąd w pliku konfiguracyjnym – anubhava

+0

@anubhava, czy możesz napisać przykładowy skrypt? Próbowałem tego: 'docker exec -it nazwa_kolekcji /etc/init.d/nginx configtest ... echo $? ... exit' i otrzymałeś następujące polecenie: '... Test fail ... 0' (zawiadomienie 0 nieoczekiwane 1) – Aliance

Odpowiedz

3

api/client/exec.go#L97-L100 robi się kod wyjścia:

var status int 
if _, status, err = getExecExitCode(cli, execID); err != nil { 
    return err 
} 

który pochodzi z api/client/utils.go#L84-L97

// getExecExitCode perform an inspect on the exec command. It returns 
// the running state and the exit code. 
func getExecExitCode(cli *DockerCli, execID string) (bool, int, error) { 
    resp, err := cli.client.ContainerExecInspect(execID) 
    if err != nil { 
     // If we can't connect, then the daemon probably died. 
     if err != lib.ErrConnectionFailed { 
      return false, -1, err 
     } 
     return false, -1, nil 
    } 

    return resp.Running, resp.ExitCode, nil 
} 

Więc jeśli komenda nie powiedzie, otrzymasz kod wyjścia.
Chociaż, as mentioned here, you could use nginx -t instead of configtest.

5

Tłumaczenie mojego komentarza na odpowiedź. Powinno to zadziałać:

docker exec -it mynginx /etc/init.d/nginx configtest && echo "pass" || echo "fail" 

To działa dla mnie.

1

znalazłem this być całkiem dobrze działa:

docker exec -t -i my-container sh -c 'my-command; exit $?' 
Powiązane problemy