2015-12-15 20 views
11

Niedawno przeniosłem aplikację node.js do obrazu w doku, a ja chciałbym uruchomić testy wewnątrz obrazu. Moje testy mocha/node działają dobrze, ale testy Karmy polegają na uruchomieniu Chrome, aby uruchomić testy, a Chrome nie jest zainstalowany w kontenerze.Jak uruchomić testy Karma z kontenera dokowanego?

Jak mam rozwiązać ten problem?

  • Zainstaluj Chrome w kontenerze? Wydaje się, że nie jest to idealne rozwiązanie, ponieważ nie chcę wysyłać Chrome na moje serwery produkcyjne wewnątrz kontenera.
  • Jakoś zezwolić na połączenie z Chrome na hoście?
  • Utwórz nowy obraz, który dziedziczy z mojego obrazu aplikacji i dodaje Chrome i inne rzeczy?

Googling 'docker & karma "ujawnia obrazy doków, ale nie mogę znaleźć instrukcji, jak myśleć o problemie i najlepszym podejściu.

+0

zajrzyj na https: // github.com/jfrazelle/dockerfiles/blob/master/chrome/stable/Dockerfile about Chrome – user2915097

+0

Dzięki Czytałem wcześniej post na blogu, ale nie wyjaśnia mi, jak postępować w tym przypadku. – MichaelJones

+0

, jeśli używasz "Utwórz nowy obraz, który dziedziczy z mojego obrazu aplikacji i dodaje Chrome i inne rzeczy?", Potrzebujesz opiekuna https://docs.docker.com/engine/articles/using_supervisord/ lub podobnego (s6, runit, narzędzia demonów ...) do zarządzania procesami – user2915097

Odpowiedz

-4

Użyj PhantomJS zamiast Chrome. Karma ma PhantomJS launcher.

PhantomJS na podstawie Blink.

zainstalować PhantomJS:

npm karma-phantomjs-launcher --save-dev 

Dodaj do Karma config:

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

EDIT

tutaj jest częścią 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 

W tym przypadku Docker zrobił jedną warstwę. W tej warstwie

  1. zainstalować bibliotekami i narzędzi (debian Jessie)
  2. zainstalować PhantomJS
  3. zainstalować NodeJS
  4. testy zakończą
  5. usunąć bibliotekami i narzędzi
  6. usunąć NodeJS
  7. usunąć PhantomJS

Testy są uruchomione i nie masz PhantomJS w pojemniku produkcyjnym.

+0

Dzięki za wejście, mógłbym spróbować tego podejścia, chociaż możliwe jest uruchomienie Chrome z okna dokowanego, więc jestem bardziej ciekawy, jak znaleźć najlepszy sposób na przyszłość. Przeważnie możliwe jest utrzymywanie kontenera w doku dość minimalnie, czy też muszę dodać do niego wszystkie elementy testowania? Mam już moduły npm do testowania, więc może nie jest nieuzasadnione, aby apt-get instalował chrom i selen, ale czuje się gorzej niż idealnego. Być może mój skrypt testowy może dodać zależności w ramach testu? Ale to też wydaje się trochę ciężkie. – MichaelJones

+0

Nie wydaje mi się, że warto używać Chrome w Dockerze. PhantomJS oparty na Chrome WebKit i jest bardzo dobrą alternatywą do uruchomienia testu. Chrome wymaga X11 do uruchomienia. PhantomJS nie. Aby uruchomićSelenium użyj GhostDriver. –

+0

Rozumiem twój punkt widzenia. Moje pytanie brzmi: czy dobrym pomysłem, czy standardową praktyką jest wysyłanie PhantomJS do produkcji, ponieważ potrzebuję go na moim obrazie do testowania lub czy istnieje sposób na przeprowadzenie testów bez dodawania całej infrastruktury testowej do obrazu produkcyjnego. – MichaelJones

3

Znalazłem ten Döcker obraz się być doskonałym punktem wyjścia do uruchamiania testów karmy szybko wewnątrz kontenera Döcker na Concourse CI:

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

Zawiera 6.x węzła (najnowsza) + npm i bezgłową instancję chromu używającą X wirtualnego framebuffera. Działa świetnie dla mnie!

+0

Czy możesz wyjaśnić nieco więcej o tym, co robisz? Czy sądzisz, że można użyć funkcji dokowania i uruchomić ją w osobnym kontenerze? lub moje testy muszą działać w kontenerze z tym obrazem? – amp

+0

@amp testy muszą przebiegać wewnątrz tego kontenera. Cały punkt tego pojemnika jest taki, że zawiera on instalację chromu, która jest w stanie wykonać testy karmy. Możesz rozpocząć kontener, ale chcesz, np. użyj 'docker exec' lub alternatywnie użyj obrazu kontenera jako bazy dla własnego pliku Dockerfile. –

Powiązane problemy