【问题标题】:Docker Nodejs Multi Stage build Error. Dist not foundDocker Nodejs 多阶段构建错误。未找到分布
【发布时间】:2020-09-18 17:28:50
【问题描述】:
FROM node:14.9-stretch-slim AS build
WORKDIR /usr/src/app
COPY ./package.json ./
RUN yarn
COPY . .
CMD ["yarn", "run", "build"]

FROM nginx:alpine
COPY nginx.conf /etc/nginx/nginx.conf
COPY --from=build /usr/src/app/dist /usr/share/nginx/html

这是我的 dockerfile。当我构建它时,我收到一条错误消息,提示找不到 dist。

COPY failed: stat /var/lib/docker/overlay2/e397e0fd69733a25f53995c12dfbab7d24ce20867fede11886d49b9537976394/merged/usr/src/app/dist: no such file or directory

知道为什么会这样吗?

任何帮助将不胜感激。

谢谢。

【问题讨论】:

  • 问题是CMD ["yarn", "run", "build"]应该是像RUN yarn run build这样的RUN命令

标签: node.js docker nginx docker-multi-stage-build


【解决方案1】:

这里的问题是在CMD ["yarn", "run", "build"] 使用CMD 而不是RUN

FROM node:14.9-stretch-slim AS build
WORKDIR /usr/src/app
COPY ./package.json ./
RUN yarn
COPY . .
RUN yarn run build

FROM nginx:alpine
COPY nginx.conf /etc/nginx/nginx.conf
COPY --from=build /usr/src/app/dist /usr/share/nginx/html

这里是 RUNCMD 的文档

来自关于CMD的文档:

CMD 的主要目的是为正在执行的容器提供默认值。这些默认值可以包含一个可执行文件,也可以省略该可执行文件,在这种情况下,您还必须指定 ENTRYPOINT 指令。

来自关于RUN的文档:

RUN 指令将在当前图像之上的新层中执行任何命令并提交结果。生成的提交图像将用于 Dockerfile 中的下一步。

如您所见,CMD 在运行容器时在运行时执行,但RUN 命令用于构建 docker 映像

下次如何调试?

在您的 Dockerfile 中,您基本上可以运行映像的任何可执行部分。所以要检查 dist 文件夹是否存在或者它的内容是什么,你可以使用ls

FROM node:14.9-stretch-slim AS build
WORKDIR /usr/src/app
COPY ./package.json ./
RUN yarn
COPY . .
RUN yarn run build
RUN ls -la dist 

FROM nginx:alpine
COPY nginx.conf /etc/nginx/nginx.conf
COPY --from=build /usr/src/app/dist /usr/share/nginx/html

【讨论】:

  • 非常感谢。工作完美。那真是一个愚蠢的错误。我完全错过了。
猜你喜欢
  • 2020-12-15
  • 2020-07-13
  • 2022-11-25
  • 2019-09-27
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-04-16
相关资源
最近更新 更多