使用多阶段构建的Dockerfile中的COPY问题 — 没有这个文件或目录

85次阅读
没有评论

问题描述

在尝试将项目转换为使用多阶段构建时,最终的步骤总是失败,并显示错误信息:

Step 11/13 : COPY --from=build /bin/grafana-server /bin/grafana-serverCOPY failed: stat /var/lib/docker/overlay2/xxxx/merged/bin/grafana-server: no such file or directory

Dockerfile如下所示:

FROM golang:latest AS build
ENV SRC_DIR=/go/src/github.com/grafana/grafana/
ENV GIT_SSL_NO_VERIFY=1
COPY . $SRC_DIR
WORKDIR $SRC_DIR
RUN npm run build && go run build.go setup && go run build.go build

FROM scratch
COPY --from=build /bin/grafana-server /bin/grafana-server
EXPOSE 3001
CMD ["./bin/grafana-server"]

错误信息并没有提供足够的帮助,只是告诉我文件在我认为它们应该存在的位置不存在。

我的文件结构如下:

--| ~/Documents/dev/grafana/src/grafana/grafana
  |--| bin
      |--| <grafan-server 编译结果在这里>
  |--| deploy
      |--| docker
          |--| Dockerfile

从目录~/Documents/dev/grafana/src/grafana/grafana,我运行命令:docker build -t grafana -f deploy/docker/Dockerfile .

解决方案

请注意以下操作可能因版本差异或其他因素而略有不同,建议根据实际情况进行适当调整。

方案

在多阶段构建的Dockerfile中,使用COPY命令将文件从一个构建阶段复制到另一个构建阶段时,需要确保路径与实际目录结构一致。错误信息提示找不到文件的原因是路径不正确,所以需要进行修正。

根据你的文件结构,正确的路径应该是/go/src/github.com/grafana/grafana/bin/grafana-server。因此,你需要修改COPY命令的源路径,使其匹配实际位置。

以下是修改后的Dockerfile部分内容:

FROM scratch
COPY --from=build /go/src/github.com/grafana/grafana/bin/grafana-server /bin/grafana-server
EXPOSE 3001
CMD ["./bin/grafana-server"]

在这里,我们将COPY命令的源路径修改为/go/src/github.com/grafana/grafana/bin/grafana-server,这样才能正确地复制编译后的grafana-server文件。

通过以上修改,你应该能够成功构建并运行镜像了。

注意事项

  • 确保npm已经正确安装在你的项目中,以便在构建过程中能够运行npm run build命令。
  • 如果在构建过程中遇到依赖问题,你可能需要检查项目的依赖关系,并确保所有必要的依赖都已经安装。可能需要在构建阶段安装一些依赖,以确保构建的成功进行。
  • 如果在运行容器时遇到/bin/sh: 1: npm: not found错误,可能是因为容器内没有安装Node.js和npm。你需要在Dockerfile中添加安装Node.js和npm的步骤。

额外提示

如果你的构建过程中仍然遇到问题,你可以尝试以下步骤来进一步排除问题:
1. 在build阶段的最后,添加一个RUN ls /bin命令,以确保grafana-server文件实际存在于正确的位置。这可以帮助你验证路径是否正确。
2. 在构建过程中添加一些日志输出,以便更好地了解每个步骤的执行情况。可以使用echoprintf命令输出相关信息。

通过以上步骤,你应该能够成功解决COPY路径问题并顺利进行多阶段构建。如果遇到其他问题,请根据具体情况进一步调查和调整。

正文完