2015-09-05 12 views
6

Utilizzo la finestra mobile-compose per lo sviluppo . Durante il processo, ho spesso bisogno di costruire 5 contenitori (1 per web-server e 4 per postgres, redis, mongo, ecc.). Il contenitore del server web è configurato per includere collegamenti per altri contenitori, ha le proprie vele ENV, volumi montati dalla macchina host di sviluppo.Costruisci contenitore con finestra mobile-componi, ma esegui/etc/bash con l'opzione -it più tardi?

Il problema è che non è necessario il contenitore Web per eseguire il server stesso. Prima di questo ho bisogno di eseguire /etc/bash con le opzioni -it all'interno del contenitore web dopo che tutti i contenitori dipendenti sono stati creati. Ecco perché, il mio dockerfile per il web-container termina con:

CMD /bin/true 

Ovviamente, tale contenitore wont essere in esecuzione, quindi non posso utilizzare smth come

docker exec -it <CONTAINER ID> /bin/bash 

di "entrare" ed eseguirlo node app.js o qualche altro compito.

Un modo per creare un contenitore con compose come parte del file docker-compose.yml, ma eseguire/etc/bash con l'opzione -it più tardi?

BTW, certamente posso avviare manualmente un web-contenitore separato con

docker run \ 
--link postgres 
--link ... 
-e "NODE_ENV=development" \ 
-e ... \ 
... 
... 
.. 

ma questo caso ho bisogno di aggiungere tutti i link, env vars, volumi, ecc come argumets ogni volta che vado a sviluppare un'app.

+0

Puoi spiegare di più sulla tua custodia/flusso di lavoro? Sembra inutilmente complesso? – johnharris85

risposta

12

Sembra che il docker-compose run diventi tuo amico. Da docker compose docs:

Esegue un comando singolo contro un servizio. Ad esempio, il seguente comando avvia il servizio Web ed esegue bash come suo comando.

$ docker-compose run web bash

Il comando docker-compose run <service-name> assicura inoltre che tutti i contenitori richieste (ad esempio quelli che forniscono volumi e collegamenti) verranno avviati prima del contenitore <service-name>, se non sono già in esecuzione.

Se si utilizzano mappature di porte, è possibile utilizzare docker-compose run --service-ports <service-name>. Senza questa opzione, docker-compose mapperà le porte solo quando si utilizza docker-compose up.

Come con docker run è anche possibile utilizzare l'opzione --rm per rimuovere i contenitori una volta terminato.

Se l'immagine utilizza ENTRYPOINT, è consigliabile prendere in considerazione questa opzione nel docker-compose.yml con entrypoint: /bin/bash.

+0

Grazie Jan, ma non proprio quello di cui ho bisogno, tuttavia ho trovato una soluzione. Proverò a postarlo tra qualche giorno. – f1nn

+0

Grazie, questo funziona bene per me. –