2014-12-24 13 views
12

Planuję środowisko dev dockera i wątpię, czy uruchamianie npm install jako warstwy buforowanej jest dobrym pomysłem.Docker i node_modules - umieść je w warstwie lub woluminie?

Rozumiem, że istnieje ways to optimize dockerfiles to avoid rebuilding node_modules unless package.json changes, jednak nie chcę całkowicie odbudować node_modules za każdym razem, gdy wprowadzane są zmiany package.json. Świeże npm install zajmuje nam ponad 5 minut, a zmiany na package.json zdarzają się dość często. Ktoś, kto często przegląda prośby o pociągnięcie i przełącza gałęzie, może cierpieć z powodu wściekłości każdego dnia na 5 minut.

Czy nie byłoby lepiej w takich przypadkach, jak kopalnia, aby jakoś zainstalować node_modules w woluminie, tak aby działał w różnych wersjach, a małe zmiany w package.json nie doprowadziły do ​​przebudowania całego drzewa zależności?

Odpowiedz

8

Tak. Nie przebudowuj node_modules w kółko. Wystarczy przykleić je do pojemnika danych i zamontować tylko do odczytu. Możesz od razu odtworzyć proces centralny node_modules.

Dodatkową korzyścią jest znacznie bardziej przewidywalna kompilacja, ponieważ można wymusić, aby wszyscy korzystali z tych samych modułów węzłów. Ma to kluczowe znaczenie, jeśli chcesz mieć pewność, że faktycznie testujesz to samo, co planujesz wprowadzić do produkcji.

Coś takiego (przetestowane!):

docker build -t my/module-container - <<END_DOCKERFILE 
FROM busybox 
RUN mkdir -p /usr/local/node 
VOLUME /usr/local/node 
END_DOCKERFILE 

docker run --name=module-container my/module-container 

docker run --rm --volumes-from=module-container \ 
    -v package.json:/usr/local/node/package.json \ 
    /bin/bash -c "cd /usr/local/node; npm install" 

Teraz, pojemnik będzie zawierał dane module-container moduły określone przez package.json w /usr/local/node/node_modules. Teraz powinno być możliwe zamontowanie go w pojemnikach produkcyjnych za pomocą --volume-from=module-container.

+0

Próbuję dowiedzieć się, jak to zrobić. Czy istnieje przewodnik, który pokaże, jak to ustawić? Czy byłbyś w stanie napisać plik konfiguracyjny, aby to pokazać? – Scotty

+0

Zaktualizowałem moją odpowiedź powyżej. – mzedeler

Powiązane problemy