Копировать вывод npm install в docker контейнер - PullRequest
0 голосов
/ 03 августа 2020

Я dockerized node.js, и все работает нормально

Dockerfile:

FROM node:alpine
WORKDIR '/app'
COPY package.json .
RUN npm install
COPY . .
EXPOSE 9000

CMD ["npm", "run", "dev"]

Я пытаюсь запустить npm install вне Dockerfile и скопировать содержимое npm install в docker контейнер

На docker хосте, на котором я работал

npm install --prefix /opt/npm/ -g

Создана папка /opt/npm/lib/node_modules/ui. В этой папке есть куча json файлов и папка node_modules. Dockerfile находится в этом foler. Теперь в Dockerfile я пропустил установку npm и просто скопировал содержимое / opt / npm / lib / node_modules / ui в docker контейнер .

Измененный Dockerfile

FROM node:alpine
WORKDIR '/app'
COPY . .
EXPOSE 9000

Создан образ из Dockerfile успешно, но при попытке запустить контейнер из этого образа

docker run -p 9000: 4200 pm

> ui@0.0.0 dev /app
> ng serve --host 0.0.0.0 --proxy-config src/proxy.conf.json

sh: ng: not found
npm ERR! code ELIFECYCLE
npm ERR! syscall spawn
npm ERR! file sh
npm ERR! errno ENOENT
npm ERR! ui@0.0.0 dev: `ng serve --host 0.0.0.0 --proxy-config src/proxy.conf.json`
npm ERR! spawn ENOENT
npm ERR!
npm ERR! Failed at the ui@0.0.0 dev script.
npm ERR! This is probably not a problem with npm. There is likely additional logging output above.
npm WARN Local package.json exists, but node_modules missing, did you mean to install?

Можно ли запустить npm install вне docker контейнера?

1 Ответ

2 голосов
/ 03 августа 2020

При докеризации любого приложения вы всегда должны компилировать и устанавливать зависимости в контейнере docker.

Форма запуска файла Docker node:alpine. это означает, что при установке пакета npm, который требует компиляции вне (вашей ОС), операционная система alpine не сможет его использовать.

Лучшая практика - всегда создавать приложение на одной и той же ОС. Таким образом docker представит контейнер сборки.

# Dockerfile
FROM node:12.13-alpine As build

WORKDIR /usr/src/app

COPY package*.json ./

RUN npm install --only=production


FROM node:12.13-alpine as production

WORKDIR /usr/src/app

COPY ./ ./ # copy static files
COPY --from=build /usr/src/app/node_modules ./. # Copy node_modules from build container

EXPOSE 3000

CMD ["node", "main.js"]
# .dockerignore
node_modules
Dockerfile

Попробуйте приспособить это к вашей среде

...