Как кешировать 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"]
Другие вопросы по тегам