将 npm install 的输出复制到 docker 容器

Copy output of npm install to docker container

我 docker 化 node.js 并且一切正常

Docker 文件:

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 主机 i 运行

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

文件夹 /opt/npm/lib/node_modules/ui 已创建。在该文件夹中有一堆 json 文件和文件夹 node_modules.Dockerfile 在 foler.Now 中,在 Dockerfile 中我跳过了 npm 安装,只是将 /opt/npm/lib/node_modules/ui 的内容复制到 docker容器。

修改后的 Dockerfile

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

从 Dockerfile 成功构建镜像,但是当尝试从该镜像 运行 容器时

docker 运行 -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 容器外?

在 docker 化任何应用程序时,您应该始终在 docker 容器中编译和安装依赖项。

您的 Docker 文件开始形式 node:alpine。这意味着当你安装一个需要在外部(你的 OS)编译的 npm 包时,alpine OS 将无法使用它。

最佳做法是始终在同一个 OS 上构建您的应用程序。这就是 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

尝试使其适应您的环境