2015-01-15 27 views
6

Desidero poter eseguire il nodo all'interno di un contenitore finestra mobile e quindi essere in grado di eseguire docker stop <container>. Questo dovrebbe interrompere il contenitore su SIGTERM piuttosto che il timeout e fare un SIGKILL. Sfortunatamente, mi sembra che manchi qualcosa, e le informazioni che ho trovato sembrano contraddire altri punti.arresto docker non funziona per il processo nodo

Ecco un Dockerfile prova:

FROM ubuntu:14.04 
RUN apt-get update && apt-get install -y curl 
RUN curl -sSL http://nodejs.org/dist/v0.11.14/node-v0.11.14-linux-x64.tar.gz | tar -xzf - 
ADD test.js/
ENTRYPOINT ["/node-v0.11.14-linux-x64/bin/node", "/test.js"] 

Ecco il test.js di cui al Dockerfile:

var http = require('http'); 

var server = http.createServer(function (req, res) { 
    console.log('exiting'); 
    process.exit(0); 
}).listen(3333, function (err) { 
    console.log('pid is ' + process.pid) 
}); 

costruisco in questo modo:

$ docker build -t test . 

l'eseguo così:

$ docker run --name test -p 3333:3333 -d test 

Poi corro:

$ docker stop test 

Al che il SIGTERM a quanto pare non funziona, inducendolo a timeout di 10 secondi più tardi e poi morire.

Ho scoperto che se mi metto il compito di nodo attraverso sh -c allora posso ucciderlo con ^C da un (-it) contenitore interattivo, ma io ancora non riesco a docker stop al lavoro. Questo è in contraddizione con i commenti che ho letto dicendo che sh non trasmette il segnale, ma potrebbe essere d'accordo con altri commenti che ho letto dicendo che il PID 1 non ottiene SIGTERM (poiché è stato avviato tramite sh, sarà PID 2).

L'obiettivo finale è di essere in grado di eseguire docker start -a ... in un processo di avvio e di essere in grado di interrompere il servizio e in realtà esce dal contenitore.

risposta

1

Ok, ho trovato una soluzione alternativa, che mi avventuro come risposta nella speranza che aiuti gli altri. Non risponde completamente perché i segnali non funzionassero prima, ma mi dà il comportamento che voglio.

L'utilizzo di baseimage-docker sembra risolvere il problema. Ecco cosa ho fatto per farlo funzionare con l'esempio di prova minimo di cui sopra:

Keep test.js così com'è.

Modifica Dockerfile a guardare come il seguente:

FROM phusion/baseimage:0.9.15 

# disable SSH 
RUN rm -rf /etc/service/sshd /etc/my_init.d/00_regen_ssh_host_keys.sh 

# install curl and node as before 
RUN apt-get update && apt-get install -y curl 
RUN curl -sSL http://nodejs.org/dist/v0.11.14/node-v0.11.14-linux-x64.tar.gz | tar -xzf - 

# the baseimage init process 
CMD ["/sbin/my_init"] 

# create a directory for the runit script and add it 
RUN mkdir /etc/service/app 
ADD run.sh /etc/service/app/run 

# install the application 
ADD test.js/

baseimage-finestra mobile include un processo init (/sbin/my_init) che gestisce a partire altri processi e trattare con zombie processes. Utilizza runit per la supervisione del servizio. Dockerfile pertanto imposta il processo my_init come comando da eseguire all'avvio e aggiunge uno script /etc/service affinché runit lo raccolga.

Lo script run.sh è semplice:

#!/bin/sh 
exec /node-v0.11.14-linux-x64/bin/node /test.js 

Non dimenticare di chmod +x run.sh!

Per impostazione predefinita, runit riavvierà automaticamente il servizio se scende.

Dopo aver eseguito questi passaggi (e creato, eseguito e fermato come prima), il contenitore risponde correttamente alle richieste di arresto, in modo tempestivo.

Problemi correlati