Вот мой Dockerfile
:
FROM node:12-slim
ENV NODE_ENV=production
WORKDIR /
# COPY . . # COPY ENTIRE FOLDER ?
COPY ./package.json ./package.json
COPY ./dist ./dist
RUN npm install --only=production
EXPOSE 8080
ENTRYPOINT npm start
Вот мой .dockerignore
файл:
node_modules
Вы видите, что я просто копирую package.json
, а не package-lock.json
. Я догадался, что раз я буду бегать RUN npm install
для сборки образа, то подумал, что он должен создать свой package-lock.json
.
Но я получил это предупреждение во время сборки:
> Step #0: > [email protected] postinstall /node_modules/protobufjs
> Step #0: > node scripts/postinstall
> Step #0:
> Step #0: npm notice created a lockfile as package-lock.json. You should commit this file.
> Step #0: npm WARN [email protected] No repository field.
> Step #0:
> Step #0: added 304 packages from 217 contributors and audited 312 packages in 15.27s
Итак, мне добавить это в мой Dockerfile
?
COPY ./package-lock.json ./package-lock.json
Это зависит от того, хотите ли вы везде иметь одинаковый env. Если да, необходим package-lock.json. Здесь есть хороший пост об этом: https://stackoverflow.com/a/64014814/4925213
У вас должен быть флаг «dev» для devDependencies в package-lock.json, поэтому он должен оставаться прежним. При сборке для производства devDependencies следует исключить с помощью этого флага.
Вы должны обязательно скопировать файл package-lock.json
. У него немного другая роль, чем у файла package.json
: package.json
может заявить: «Я почти уверен, что мое приложение работает с версией 17 пакета react
», где package-lock.json
говорит: «Я собрал и протестировал именно с версией 17.0.1 этого пакета".
Если у вас есть оба файла, существует отдельная команда npm ci, оптимизированная для этого случая.
COPY package.json package-lock.json .
# Run `npm ci` _before_ copying the application in
RUN NODE_ENV=production npm ci
# If any file in `dist` changes, this will stop Docker layer caching
COPY ./dist ./dist
Спасибо, я также нашел больше информации о npm ci
и его поведении с devDependencies
в этом другом вопросе/ответе: stackoverflow.com/questions/60065865/…
Я предполагаю, что, поскольку я устанавливаю
--only production
,package-lock.json
будет отличаться от того, что у меня есть в моей локальной среде разработки, верно? Потому что вdevDependencies
есть немногоpackage.json
. Должен ли я оставить это и игнорировать предупреждение?