Docker riavvia il punto di accesso

Ho iniziato ad utilizzare il docker circa un mese fa e non riesco a trovare una soluzione soddisfacente per la situazione seguente.

Vorrei distribuire un'applicazione NodeJS e, poiché usare ENTRYPOINT è una buona pratica che preferirei utilizzare questo command: ENTRYPOINT ["node", "src/start.js"] .

Tuttavia non ho trovato un modo per riavviare il process di entrypoint all'interno del contenitore, il che significa che each volta che cambio qualcosa all'interno dell'applicazione nodejs devo riavviare tutto il contenitore che è lievemente fastidioso in un ambiente di sviluppo con un volume condiviso.

Una soluzione che ho pensato sarebbe di utilizzare un responsabile di process per questo e fare qualcosa come ENTRYPOINT ["pm2", "src/start.js"] ma utilizzando un responsabile di process per un unico process mi sembra sbagliato.

Mi piacerebbe chiedere un approccio che mi avvicina al più caldo ansible senza cambiare il Dockerfile tra il mio "Development Docker" e il "Docker di produzione".

TL: DR : Dovrebbe essere ansible NON avere NodeJS o qualsiasi cosa l'applicazione richiede installata sulla mia macchina di sviluppo ma eseguire tutto da un contenitore docker mentre è in grado di riavviare il process di nodo in detto contenitore senza wherer riavviare il contenitore stesso. Non è un'opzione per me cambiare il Dockerfile e vorrei usare ENTRYPOINT .

EDIT :
Dockerfile

 FROM mhart/alpine-node:4.4.7 # add curl and bash RUN apk add --update curl bash #Add user RUN addgroup websites && adduser -s /bin/bash -D -G websites user-api #Copy app WORKDIR /srv/app ADD src ./src/ ADD node_modules ./node_modules #Expose port EXPOSE 3000 ENTRYPOINT ["node", "src/start.js"] 

Costruire l'image con

 docker build -t app . 

Eseguire il contenitore sulla mia stazione di lavoro con

 docker run -dit -p 53017:3000 --name app -vc:/Users/hesxenon/Projects/app:/srv/app app:latest 

C'è un ottimo module npm per questo pm2 . Installarlo come un pacchetto globale nell'image base di nodejs.

Avvia l'applicazione con ENTRYPOINT ["pm2-docker", "src/start.js"]

È quindi ansible inserire l'image del pm2 stop 0 con l' pm2 stop 0 docker exec -ti <containerid> <shell> e arrestare l'applicazione utilizzando pm2 stop 0 , quindi riconfigurare e avviarlo nuovamente con pm2 start 0 . Whitout uccidendo il contenitore così per pid1 morire.

docker stop richiede 10 secondi per impostazione predefinita – è ansible modificarlo con un arg, ma il docker restart dovrebbe essere quasi immediato e dovrebbe essere la stessa cosa del riavvio del nodo.

Non sono abbastanza sicuro di cosa intendi con il "sistema" sottostante , non è un VM e finché non si riavvia l'host Docker, riavviando il contenitore (se è impostato correttamente) non dovrebbe richiedere molto più tempo che riavviare il process stesso.

Provare a gestire i segnali SIGTERM e SIGINT in Node.js.

Un docker stop e docker restart inviano un SIGTERM al process. Se non esiste un gestore SIGTERM , il docker attende il timeout predefinito di 10 secondi finché non invia un SIGKILL e il process viene riavviato. Questo potrebbe essere la maggior parte del ritardo di riavvio.

Mentre avete a che fare con i segnali, un ctrlc invia un SIGINT così anche a gestire questo.

 process.on('SIGTERM', function () { console.log('SIGTERM'); process.exit(0); } process.on('SIGINT', function () { console.log('SIGINT'); process.exit(0); } 

Sul Dockers Overhead

Ecco alcune informazioni sul sovraccarico che richiede un contenitore in cima al process che stai lanciando. È abbastanza minimale, quindi un test veloce:

 [email protected]:~$ time true real 0m 0.00s user 0m 0.00s sys 0m 0.00s [email protected]:~$ time docker run busybox true real 0m 0.64s user 0m 0.01s sys 0m 0.00s 

Quindi un VM sul mio computer porttile richiede circa 0,64 minuti per lanciare un process in un contenitore rispetto ad un process normale.

Penso che l'opzione migliore sia usare il nodemon: https://www.npmjs.com/package/nodemon

Esegue il monitoraggio delle directory di origine specificate e riavvia se qualcosa cambia.

Inoltre, come un bonus aggiunto per aumentare l'ora di avvio del contenitore, se si copia il package.json e quindi eseguire npm installare sul contenitore utilizzerà il pacchetto memorizzato nella cache json, probabilmente taglierà fino a un secondo o due come i node_modules sarà la tua cartella più grande da copiare: come eseguire la cache dell'istruzione di installazione NUN RUN quando il docker costruisce un Dockerfile

 COPY package.json . RUN npm install COPY src ./src/