node.js - Dockerfile 应该执行 "npm install"和 "npm run build"还是应该只复制这些文件?

标签 node.js docker build dockerfile devops

我对 Docker 有点陌生,并试图围绕其中的一些概念进行思考。
在很多教程和文章(实际上,几乎所有)中,这是一个典型的用于 create-react-app 和 nginx 配置的 Dockerfile:

# CRA
FROM node:alpine as build-deps
WORKDIR /usr/src/app
COPY package.json package-lock.json ./
RUN npm install
COPY . ./
RUN npm run build

# Nginx
FROM nginx:1.12-alpine
COPY --from=build-deps /usr/src/app/build /usr/share/nginx/html
EXPOSE 80
CMD ["nginx", "-g", "daemon off;"]
假设一切都按预期进行,图像将是巨大的。
我有采取稍微不同的方法的想法。运行 npm install && npm run build本地,然后将其作为 Dockerfile:
FROM nginx:1.12-alpine
WORKDIR /opt/app-root

COPY ./nginx/nginx.conf /etc/nginx/
COPY ./build ./src/dist/

COPY ./node_modules .

USER 1001
EXPOSE 8080
ENTRYPOINT ["nginx", "-g", "daemon off;"]
哪种方法更好?每当我跑 docker build -t app-test:0.0.1 . ,在我看来,第二种方法总是更快。

最佳答案

在容器内构建可确保可预测和可重现的构建工件。运行 npm install在 macOS 和 Linux 上可以产生不同的 node_modules ,例如 node-gyp .
人常建node_modules使用多阶段构建(如果您尝试构建的实际容器不是 Node.js 应用程序)。也就是说,你实际的 nginx 应用程序本身并不依赖于 Node.js,而是依赖于 node_modules目录及其包含的文件。所以我们生成 node_modules在 Node 容器中,并将其复制到新容器(nginx)。
因此,使用多阶段 Dockerfile 构建的每个人都会产生 精确同一个容器。如果您复制本地 node_modules在构建过程中放入容器,其他同事将无法预测 node_modules 的内容.

关于node.js - Dockerfile 应该执行 "npm install"和 "npm run build"还是应该只复制这些文件?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/65734632/

相关文章:

go - 从二进制文件中一致地构建/删除个人信息

javascript - 意外的空白 Ajax 响应文本

macos - 如何找到旧版本的 Node ?

node.js - 静态 javascript 未在 jade 中呈现(使用 express/node.js)

Docker Compose、Rails 和 Webpacker 不支持 node_modules

c++ - 构建或编译

javascript - 尝试使用函数组合时出现 ReferenceError : error is not defined,

docker - docker-elasticsearch + kibana从保存的对象开始

docker - 更改 Docker 退避时间

ios - 如何使用 xcode 为其他证书/商店帐户构建 ios 应用程序