2015-01-21 16 views
5

Sto scrivendo un Dockerfile che deve eseguire più comandi come parte dell'istruzione CMD e ho pensato che il modo corretto per farlo sarebbe quello di eseguire uno script di shell con il demone principale eseguito tramite exec. Sfortunatamente, come parte di quel processo, alcuni dei miei risultati (stdout? Stderr? Non so, e non so come scoprirlo) si perdono.Quando si esegue un server di sviluppo Django con docker/fig, perché alcuni output del registro sono nascosti?

Ecco lo script di shell:

#!/bin/sh 

python manage.py migrate 
exec python manage.py runserver 0.0.0.0:8000 

L'idea è che il comando migrate è gestita solo una volta e la sua uscita indicata, e quindi il comando runserver deve prendere il sopravvento e il contenitore durerà fino che esce di processo.

Il problema reale è che l'output di migrate viene visualizzato correttamente, ma l'output immediato di runserver non viene visualizzato. Stranamente, la successiva richiesta di registrazione di runserver viene mostrata correttamente.

Per chiarire, ecco l'output che mi aspettavo:

[...] 
No migrations to apply. 
[...] 
Starting development server at http://0.0.0.0:8000/ 
Quit the server with CONTROL-C. 
[21/Jan/2015 16:27:06] "GET/HTTP/1.1" 200 15829 

Ecco quello che sto ottenendo con fig up:

[...] 
No migrations to apply. 
[...] 
[21/Jan/2015 16:27:06] "GET/HTTP/1.1" 200 15829 

io non sono nemmeno sicuro che la colpa è. Il comando runserver cambia l'output a seconda di come viene eseguito? È un problema con exec? È docker/fig?

Come punto dati aggiuntivo, ho notato che ottengo tutto l'output quando si esegue il contenitore con fig run web, ma non quando faccio fig up, ma non capisco come sia diverso o rilevante.

Nota: mi dispiace per il tag spam, ridurrò i tag una volta che so cosa causa effettivamente questo effetto.

+0

È possibile reindirizzare l'output manualmente e utilizzare i reindirizzamenti append '>>' in seguito. – Paul

+0

@Paul Cosa intendi? Non sto usando alcun '>>' aggiungi i redirect. –

+0

Perché eseguire la migrazione prima di ogni runserver? Puoi fare 'django-admin.py' un punto di accesso ed eseguire la migrazione come' fig run migrate'. –

risposta

5

Ho trovato questo vecchio problema oggi utilizzando la finestra mobile di composizione. Il modulo di registrazione Python verifica che l'uscita sia un terminale, quindi è necessario aggiungere tty: true al servizio. Esempio:

version: '2' 
services: 
    django: 
    tty: true 
    command: python -u manage.py runserver 0.0.0.0:8080 
    ports: 
    - "8080:8080" 
+0

Non ho la possibilità di testare questo adesso, ma suona come una spiegazione molto plausibile, quindi grazie per aver postato i risultati qui! –

+0

Funziona perfettamente per me, grazie mille. Questa risposta dovrebbe essere accettata. –

+0

Accettato, in base alla conferma di Robin. –