2015-12-15 3 views
11

Ho recentemente spostato la mia app node.js in un'immagine docker e vorrei eseguire i miei test all'interno dell'immagine. I miei test mocha/node funzionano bene ma i test Karma prevedono l'avvio di Chrome per eseguire i test e Chrome non è installato nel contenitore.Come eseguire i test Karma dal contenitore docker?

Come posso risolvere questo problema?

  • Installa Chrome nel contenitore? Sembra meno che ideale in quanto non voglio spedire Chrome ai miei server di produzione all'interno del container.
  • In qualche modo consente di connettersi a Chrome sull'host?
  • Creare una nuova immagine che eredita dall'immagine della mia app e aggiunge Chrome e altre cose?

Googling 'finestra mobile & karma' rivela immagini docker là fuori, ma non riesco a trovare le istruzioni su come pensare al problema e l'approccio migliore.

+0

dai un'occhiata a https: // github.com/jfrazelle/dockerfiles/blob/master/chrome/stable/Dockerfile su Chrome – user2915097

+0

Grazie a questo ho già letto il post sul blog, ma non chiarisce come procedere in questo caso. – MichaelJones

+0

se si utilizza "Crea una nuova immagine che eredita dall'immagine della mia app e aggiunge Chrome e altre cose?", È necessario il supervisore https://docs.docker.com/engine/articles/using_supervisord/ o tale (s6, runit, demone tools ...) per gestire i tuoi processi – user2915097

risposta

-4

Utilizzare PhantomJS anziché Chrome. Karma ha PhantomJS launcher.

PhantomJS basato su Blink.

Installare PhantomJS:

npm karma-phantomjs-launcher --save-dev 

Aggiungi al Karma config:

module.exports = function(config) { 
    config.set({ 
    browsers : ['PhantomJS'] 
    }); 
}; 

EDIT

Qui fa parte od Dockerfile

ENV NODE_VERSION 0.12.7 
ENV NPM_VERSION 3.5.1 
ENV PHANTOM_JS phantomjs-1.9.8-linux-x86_64 

# App and test 
RUN set -x \ 
    && buildDeps='curl git bzip2 file libfreetype6 libfontconfig1 python-pip python-dev libpq-dev libmemcached-dev libzmq-dev libjpeg62-turbo-dev zlib1g-dev libtiff5-dev make g++ psmisc' \ 
    && apt-get update \ 
    && apt-get install -y $buildDeps --no-install-recommends \ 
    && rm -rf /var/lib/apt/lists/* \ 
    && curl -SLO "https://bitbucket.org/ariya/phantomjs/downloads/$PHANTOM_JS.tar.bz2" \ 
    && tar xvjf $PHANTOM_JS.tar.bz2 \ 
    && mv $PHANTOM_JS /usr/local/share \ 
    && ln -sf /usr/local/share/$PHANTOM_JS/bin/phantomjs /usr/local/bin \ 
    && curl -SLO "https://nodejs.org/dist/v$NODE_VERSION/node-v$NODE_VERSION-linux-x64.tar.gz" \ 
    && curl -SLO "https://nodejs.org/dist/v$NODE_VERSION/SHASUMS256.txt.asc" \ 
    && gpg --verify SHASUMS256.txt.asc \ 
    && grep " node-v$NODE_VERSION-linux-x64.tar.gz\$" SHASUMS256.txt.asc | sha256sum -c - \ 
    && tar -xzf "node-v$NODE_VERSION-linux-x64.tar.gz" -C /usr/local --strip-components=1 \ 
    && rm "node-v$NODE_VERSION-linux-x64.tar.gz" SHASUMS256.txt.asc \ 
    && npm install -g [email protected]"$NPM_VERSION" grunt-cli \ 
    && npm install \ 
    && npm cache clear \ 
    && ./node_modules/.bin/bower install --allow-root \ 
    && npm test \ 
    && apt-get purge -y --auto-remove $buildDeps \ 
    && rm -rf /usr/local/bin/node /usr/local/bin/npm /usr/local/include/node /usr/local/lib/node_modules \ 
    && rm -rf /usr/local/share/$PHANTOM_JS /usr/local/bin/phantomjs 

In questo caso Docker ha creato uno strato. In questo strato

  1. installare librerie e strumenti (debian jessie)
  2. installare PhantomJS
  3. installare NodeJS
  4. eseguire prove
  5. rimuovere librerie e strumenti
  6. rimuovere NodeJS
  7. rimuovere PhantomJS

I test sono in esecuzione e PhantomJS non è presente nel contenitore di produzione.

+0

Grazie per l'input, potrei provare questo approccio anche se è possibile avviare Chrome dalla finestra mobile, quindi sono più curioso di trovare la migliore strada da percorrere. Per lo più, è possibile mantenere il contenitore docker alquanto minimo o devo aggiungere anche tutti i materiali di test? Ho già dei moduli npm per il test, quindi forse non è irragionevole anche apt-get install chrome e selenio, ma non sembra ideale. Forse il mio script di test può aggiungere le dipendenze come parte del test? Ma sembra un po 'troppo pesante. – MichaelJones

+0

Non penso che sia una buona idea usare Chrome all'interno di Docker. PhantomJS basato su Chrome WebKit ed è un'ottima alternativa per eseguire test. Chrome ha bisogno di X11 per funzionare. PhantomJS no. Per eseguireSelenium utilizzare GhostDriver. –

+0

Prendo il tuo punto. La mia domanda a questo punto è se sia una buona idea o una pratica standard spedire PhantomJS alla produzione perché ne ho bisogno nella mia immagine per testare o se c'è un modo per eseguire i test senza aggiungere tutta l'infrastruttura di test all'immagine di produzione. – MichaelJones

3

ho trovato questa immagine finestra mobile ad essere un ottimo punto di partenza per l'esecuzione di test Karma rapidamente all'interno di un contenitore finestra mobile sul Concourse CI:

https://hub.docker.com/r/markadams/chromium-xvfb-js/

Contiene nodo 6.x (ultima) + NPM e un'istanza di cromo senza testa che usa X framebuffer virtuale. Funzionando alla grande per me!

+0

Potresti spiegare un po 'di più su cosa stai facendo? Pensi che sia possibile usare docker-compose ed eseguirlo in un contenitore separato? o i miei test devono essere eseguiti nel contenitore con questa immagine? – amp

+0

@amp i test devono essere eseguiti all'interno di questo contenitore. Il punto centrale di questo contenitore è che contiene un'installazione chromium in grado di eseguire test di karma. Puoi avviare il contenitore come preferisci, quindi ad es. usa 'docker exec', o in alternativa usa l'immagine del contenitore come base per il tuo Dockerfile. –