纱线安装错误“ENOENT:没有这样的文件或目录

Posted

技术标签:

【中文标题】纱线安装错误“ENOENT:没有这样的文件或目录【英文标题】:Yarn install errors with "ENOENT: no such file or directory 【发布时间】:2020-11-16 02:05:50 【问题描述】:

我有一个Dockerfile,当我在本地运行它时,一切正常,但是我通过 GitHub 操作的构建似乎失败了,我得到的错误是:

error An unexpected error occurred: "ENOENT: no such file or directory, stat '/home/runner/work/akira/akira/README.md'".

我尝试删除yarn.lock,但没有成功,可以在here找到完整的构建日志,我的Dockerfile如下:

Dockerfile:

FROM node:14.0.0 AS base
WORKDIR /usr/src/app

FROM base as builder
COPY ./lerna.json .
COPY ./package.json .
COPY ./tsconfig.json .
COPY ./yarn.lock .
COPY ./packages/akira/prisma ./packages/akira/prisma
COPY ./packages/akira/src ./packages/akira/src
COPY ./packages/akira/types ./packages/akira/types
COPY ./packages/akira/package*.json ./packages/akira/
COPY ./packages/akira/tsconfig.json ./packages/akira
RUN yarn install --frozen-lockfile
RUN yarn build

FROM builder as migrate
RUN yarn workspace akira prisma migrate up --experimental

FROM base AS app
COPY --from=builder /usr/src/app/yarn.lock .
COPY --from=builder /usr/src/app/packages/akira/dist ./dist
COPY --from=builder /usr/src/app/packages/akira/prisma ./prisma
COPY --from=builder /usr/src/app/packages/akira/package.json .
RUN yarn install --production
USER node
ENV NODE_ENV=production
EXPOSE 4000
CMD ["node", "dist/index.js"]

【问题讨论】:

您使用哪个命令在本地运行它?看起来 GitHub 操作实际上并没有使用 Dockerfile... 泊坞窗构建。 GitHub 使用 Dockerfile,因为那是 yarn install —production 命令的来源,可能是什么问题? 【参考方案1】:

如果您查看您的GitHub Actions workflow, 或您链接的失败构建的日志,它似乎在 docker 之外运行 yarn 命令。

看起来yarn 正在为 README 符号链接而苦苦挣扎,不知道为什么,但看起来你想用 docker 构建,我会尝试以下方法:

替换这部分yaml

- name: Use Node.js
  uses: actions/setup-node@master
  with:
    node-version: 14.4.0

- name: Install dependencies
  run: yarn --frozen-lockfile

- name: Build packages
  run: yarn build

类似的东西

- name: Build docker image
  run: docker build .

编辑

正如下面的评论所指出的,Dockerfile 包含部署数据库迁移的副作用。

如果您不想在构建管道中运行 Dockerfile 中的所有内容, 您可以利用multi-stage builds 并在特定阶段停止。

即将迁移移动到自己的阶段:

FROM node:14.0.0 AS base
WORKDIR /usr/src/app

FROM base as builder
COPY ./lerna.json .
<< lines omitted >>
RUN yarn install --frozen-lockfile
RUN yarn build

FROM builder AS migr
RUN yarn workspace akira prisma migrate up --experimental

FROM base AS app
COPY --from=builder /usr/src/app/yarn.lock .
<< lines omitted >>

然后你可以在builder 阶段之后停止

docker build --target builder .

编辑 2

或者您可以保持构建管道和 Dockerfile 不变,而是修复损坏的符号链接,即恢复提交 0c87fa3

【讨论】:

我认为这不是一个好的解决方案,因为 dockerfile 是在 Heroku 上运行的,它失败了,因为它无法在 GitHub 操作github.com/pandaniell/akira/runs/… 中运行迁移 - 关于符号链接:我创建了它在 Linux 上,当时一切正常,最近我推过 windows,我确实看到了自述文件的更改,但据我所知,它实际上并没有改变任何可见的东西github.com/pandaniell/akira/commit/… 这是差异 好的,此时您有两个选择。 1-更新您的 Dockerfile,以便 build 工作流可以在不应用迁移的情况下使用它或 2-调查为什么 yarn --frozen-lockfile 在 docker 之外失败。我不知道怎么做 2,但我会通过回答来编辑你怎么做 1 ? 我在回答中添加了一条建议,说明如何更新 Dockerfile 以仅运行“builder”阶段。否则,您可能可以通过在 linux 中删除并重新创建它来修复 README 符号链接。如果我将 repo 克隆到 linux,它还会显示 README 的符号链接损坏。 抱歉,垃圾评论... > 谢谢!我恢复了 README 并更改了构建步骤

以上是关于纱线安装错误“ENOENT:没有这样的文件或目录的主要内容,如果未能解决你的问题,请参考以下文章

纱线安装命令时出现 ESOCKETTIMEDOUT 错误

纱线安装错误“ENOENT:没有这样的文件或目录

错误:该项目似乎需要纱线,但它没有安装

使用纱线包管理器的错误

纱线安装已替换为 `add`

用'纱线安装'安装'主角'依赖的问题