【发布时间】:2020-08-21 01:40:37
【问题描述】:
在使用 docker build 命令构建映像时,我的 nodejs 应用程序构建时间很长。
有一个大问题需要几分钟时间
08:03:15 Step 1/11 : FROM node:14.1.0-alpine AS build
08:03:15 ---> 0854fcfc1637
08:03:15 Step 2/11 : COPY server/package*.json /nodejs/server/
08:03:15 ---> Using cache
08:03:15 ---> 4996283ff991
08:03:15 Step 3/11 : WORKDIR /nodejs/server
08:03:15 ---> Using cache
08:03:15 ---> 93e5b63fa81d
08:03:15 Step 4/11 : RUN npm ci
08:03:15 ---> Using cache
08:03:15 ---> 2c825e02ea01
08:03:15 Step 5/11 : COPY server ./
08:03:15 ---> Using cache
08:03:15 ---> 69c024cde79f
08:03:15 Step 6/11 : WORKDIR /nodejs
08:03:15 ---> Using cache
08:03:15 ---> 49d7f8bd9514
08:03:15 Step 7/11 : COPY package*.json ./
08:03:16 ---> e82bee625c3e
08:03:16 Step 8/11 : RUN npm ci
08:03:16 ---> Running in ecfd57702906
...
08:03:49 added 1483 packages in 26.419s
08:09:40 Removing intermediate container ecfd57702906
...
08:09:40 ---> 7c6b67d85b0b
08:09:40 Step 9/11 : COPY *.json ./
08:09:43 ---> 0165efd1c97d
08:09:43 Step 10/11 : COPY src ./src/
08:09:51 ---> 42e54cee6b91
08:09:51 Step 11/11 : RUN npm run build:prod
08:09:51 ---> Running in af6f9b013d27
在构建 Java 映像时不会发生这种情况。
我的 Dockerfile
FROM node:14.1.0-alpine AS build
COPY server/package*.json /nodejs/server/
WORKDIR /nodejs/server
RUN npm ci
COPY server ./
WORKDIR /nodejs
COPY package*.json ./
RUN npm ci
COPY *.json ./
COPY src ./src/
RUN npm run build:prod
...
我尝试使用 buildkit,但它具有相同的行为
08:37:20 #17 exporting to image
08:37:20 #17 exporting layers
08:50:12 #17 exporting layers 766.8s done
我还将 node_modules 添加到 .dockerignore 文件中,但没有任何更改。
Docker 版本 19.03.6,构建 369ce74a3c
可能是什么问题?
“添加了 1483 个包...”和“删除中间容器”之间发生了什么?
【问题讨论】:
-
你看到
Step 11/11 : RUN npm run build:prod了吗?在这种情况下,请尝试删除该行并再次运行,在步骤 10/10 之后,运行docker exec -it <container_id> /bin/sh太 ssh 到容器。然后尝试直接在终端窗口中运行npm run build:prod看看结果。我的猜测是服务器在尝试启动时可能会崩溃。 -
是的,我可以看到它(刚刚添加到我的问题中),但它是在挂起后执行的。可能很难尝试您的建议,因为该机器是 Jenkins 代理,但我会尝试这样做。
-
啊,我明白了,是的,这不是该命令的问题。尝试相同的操作,但删除最后 4 行,然后在容器上手动运行
npm ci,查看软件包的安装是否中断。由于您使用的是 alpine,因此可能需要很多缺少的软件包。几周前我遇到了同样的问题。此外,如果您要安装许多需要构建和制作等的繁重软件包,则必须确保您的 docker 有足够的资源。打开 docker app -> 资源并尽可能分配更多 CPU、RAM 和交换以加快速度(只是不要全部分配)。 -
感谢@JonathanNielsen 我尝试了您的建议,但是从容器内部运行时构建行为正常。 docker stats 还显示容器的 RAM 限制为 6GB,因此这看起来也不是问题。我注意到的一件事是,在 npm ci 期间,Google 要求允许分析,所以我在 Dockerfile 中添加了 ENV NG_CLI_ANALYTICS false,但仍然是相同的行为。