Как кешировать node_modules в сборке Docker?
Я некоторое время пытался кешировать node_modules
на сборке Docker. Я пробовал несколько подходов, в том числе один здесь, но безуспешно.
Моя главная причина кеширования в том, что на создание моего образа уходит более 30 минут, а это слишком много.
мой Dockerfile
:
# This image will be based on the oficial nodejs docker image
FROM node:4.2.1
RUN npm install -g jspm@0.17.0-beta.7 && \
npm install -g gulp && \
npm install -g tsd
# Use changes to package.json to force Docker not to use the cache
# when we change our application's nodejs dependencies:
ADD package.json /src/package.json
RUN cd /src && npm install
# Put all our code inside that directory that lives in the container
ADD . /src
# Set in what directory commands will run
WORKDIR /src
# Install dependencies
RUN cd /src && \
tsd reinstall -so && \
jspm install && \
gulp build -p
# Tell Docker we are going to use this port
EXPOSE 3000
# The command to run our app when the container is run
CMD ["npm", "run", "start-production"]
у меня нет .dockerignore
файл. Я добавил один раньше, но он все еще не кешировал node_modules
,
Итак, как мне кэшировать мои node_modules? Не стесняйтесь предлагать модификации к Dockerfile
,
Спасибо!
1 ответ
Я не уверен, является ли это корнем ошибки, но попробуйте указать папку назначения в команде ADD, а не файл назначения.
ADD package.json /src
Более того, вы можете использовать COPY вместо ADD (ADD может работать с URL и архивами, но здесь вам это не нужно).
Вы также можете указать свой рабочий каталог ранее в файле.
Попробуйте с этим кодом:
# This image will be based on the oficial nodejs docker image
FROM node:4.2.1
RUN npm install -g jspm@0.17.0-beta.7 && \
npm install -g gulp && \
npm install -g tsd
# Set in what directory commands will run
WORKDIR /src
# Use changes to package.json to force Docker not to use the cache
# when we change our application's nodejs dependencies:
COPY package.json ./
RUN npm install
# Put all our code inside that directory that lives in the container
COPY . ./
# Install dependencies
RUN tsd reinstall -so && \
jspm install && \
gulp build -p
# Tell Docker we are going to use this port
EXPOSE 3000
# The command to run our app when the container is run
CMD ["npm", "run", "start-production"]