Il punto di ingresso per un contenitore finestra mobile indica al daemon docker cosa eseguire quando si desidera "eseguire" quel contenitore specifico. Facciamo le domande "che cosa deve eseguire il contenitore quando viene avviato la seconda volta?" o "cosa deve essere eseguito dal contenitore dopo il riavvio?"
Probabilmente, quello che stai facendo è seguire lo stesso approccio che fai con i meccanismi di "vecchia scuola". Il tuo script sta "installando" gli script necessari e tu eseguirai la tua app come un servizio systemd/upstart, giusto? Se lo fai, dovresti cambiarlo in una definizione più "dockerized".
Il punto di ingresso per tale contenitore deve essere uno script che avvia effettivamente l'app anziché impostare le cose. Supponiamo che sia necessario installare java per poter eseguire la tua app. Così nel dockerfile si imposta il contenitore di base per installare tutte le cose che avete bisogno come:
FROM alpine:edge
RUN apk --update upgrade && apk add openjdk8-jre-base
RUN mkdir -p /opt/your_app/ && adduser -HD userapp
ADD target/your_app.jar /opt/your_app/your-app.jar
ADD scripts/init.sh /opt/your_app/init.sh
USER userapp
EXPOSE 8081
CMD ["/bin/bash", "/opt/your_app/init.sh"]
I nostri contenitori, presso l'azienda per cui lavoro, prima di eseguire l'applicazione effettiva nello script init.sh che recuperano il configurazioni da console (invece di fornire un punto di mount e posizionare le configurazioni all'interno dell'host o incorporarle nel contenitore). Così lo script sarà simile:
#!/bin/bash
echo "Downloading config from consul..."
confd -onetime -backend consul -node $CONSUL_URL -prefix /cfgs/$CONSUL_APP/$CONSUL_ENV_NAME
echo "Launching your-app..."
java -jar /opt/your_app/your-app.jar
Un consiglio che posso darvi è (a mio davvero breve esperienza di lavoro con i contenitori) trattare i contenitori come se fossero senza stato, una volta che sono accantonati (tutti i comandi si esegue prima del punto di ingresso).
fonte
2016-06-15 13:39:58
Completamente d'accordo sul considerare i container senza stato. Se ci sono dati da inizializzare, inseriscili in un volume. – BMitch
Mi piacerebbe molto seguire il tuo consiglio, ma non è così facile. Ho pochissima influenza sui cambiamenti dell'app e dovevo essere modificato A LOT per usarlo come descritto. Ad esempio: ogni volta che si avvia un contenitore, lo script di inizializzazione imposta un database per l'app. Questo non dovrebbe accadere quando il container viene riavviato, poiché sovrascrive i dati già presenti ... Sfortunatamente è stato molto difficile insegnare agli sviluppatori della app come utilizzare la finestra mobile. Quindi sto cercando di mantenerlo estremamente semplice per loro. – christian
come si esegue questo? – StarWind0