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

ove*_*wed 0 node.js dockerfile npm-install

我对 Node.js 进行了 docker 化,一切正常

Dockerfile:

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

CMD ["npm", "run", "dev"]
Run Code Online (Sandbox Code Playgroud)

我正在尝试在 Dockerfile 之外运行npm install并将内容复制npm install到 docker 容器

在我运行的 docker 主机上

npm install --prefix /opt/npm/ -g
Run Code Online (Sandbox Code Playgroud)

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

修改后的 Dockerfile

FROM node:alpine
WORKDIR '/app'
COPY . .
EXPOSE 9000
Run Code Online (Sandbox Code Playgroud)

已成功从 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?
Run Code Online (Sandbox Code Playgroud)

是否可以npm install在 docker 容器之外运行?

Dan*_*iel 5

当对任何应用程序进行 docker 化时,您应该始终在 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"]
Run Code Online (Sandbox Code Playgroud)
# .dockerignore
node_modules
Dockerfile
Run Code Online (Sandbox Code Playgroud)

尝试使其适合您的环境