Docker的Github操作-找不到node_modules状态文件-运行安装可能会有帮助(findPackageLocation)?

nukf8bse  于 2023-04-29  发布在  Docker
关注(0)|答案(2)|浏览(256)

bounty还有5天到期。回答此问题可获得+50声望奖励。TheTanadu想要引起更多关注这个问题:我试着自己搜索,大部分类似的错误都在本地解决了,我试过了--没有用。看起来好像docker镜像有问题。

在做项目的时候,我在使用Dockerized的方式创建自己的Github操作时遇到了麻烦。在操作运行过程中,我收到错误消息Usage Error: Couldn't find the node_modules state file - running an install might help (findPackageLocation)。但是我构建它,node_modules是在容器中创建的。所以它应该在那里。我检查了堆栈上的其他问题,但它们似乎只是本地的,与Github Action无关。
以下是我的Github Actions工作流程的说明:
action.yml(in User/my-action@main

name: 'Reusable Action'
description: 'Independent Reusable Action'

inputs:
  github-token:
    description: 'Github token'
    required: true

outputs:
  some_output:
    description: 'Some output'

runs:
  using: 'docker'
  image: 'Dockerfile'

这里是Dockerfile(User/my-action@main

FROM node:16-alpine

WORKDIR /usr/src/app
ENV PATH=/usr/src/app/node_modules/.bin:$PATH

# Install dependencies
RUN apk add --no-cache git openssh-client python3 make g++

# copy project
COPY . .

# Check yarn, should be 3.5.0 (it shows up as 3.5.0)
RUN cat /usr/src/app/.yarnrc.yml
RUN printf "Project yarn version: "; yarn --version

# Install yarn dependencies
RUN yarn install

# build
RUN yarn build
RUN echo "Successfully built"

CMD [ "yarn", "start" ]

下面是我如何在工作流(User/other-repo)中调用它

name: My reusable action in other repo
description: It's reusable

inputs:
  secret_token:
    required: true
    description: Secret to use for authentication

runs:
  using: composite
  steps:
    - name: Do this
      id: my-id
      uses: User/my-action@main
      with:
        github-token: ${{ inputs.secret_token }}

    - name: Overwrite PR body
      id: overwrite_pr_body
      uses: AsasInnab/pr-body-action@v1
      with:
        body: ${{ steps.my-id.outputs.some_output }}
        GITHUB_TOKEN: ${{ inputs.secret_token }}

当在本地(docker build -t my-test-image .)运行它时,它会通过。..但是当在GitHub Actions中运行时,它会失败,并出现上面的错误代码。
除了上面提到的,我还做了以下尝试:

  • 更新项目到Yarn浆果
  • 由于this问题而删除。锁
  • 指定的usr/src/app工作目录
3npbholx

3npbholx1#

经过一些调查,我发现问题出在运行yarn start命令的方式上。我最初将它包含在DockerfileCMDENTRYPOINT指令中。
然而,我发现通过将yarn start命令移动到一个单独的脚本中,然后从“ENTRYPOINT”指令调用该脚本,容器在Github Action中正确启动。
最终外观:

FROM node:16-alpine

WORKDIR /usr/src/app
ENV PATH=/usr/src/app/node_modules/.bin:$PATH

# Install dependencies
RUN apk add --no-cache git openssh-client python3 make g++

# copy entrypoint
COPY entrypoint.sh /entrypoint.sh

# copy project
COPY . .

# Check yarn, should be 3.5.0 (it shows up as 3.5.0)
RUN cat /usr/src/app/.yarnrc.yml
RUN printf "Project yarn version: "; yarn --version

# Install yarn dependencies
RUN yarn install

# build
RUN yarn build
RUN echo "Successfully built"

ENTRYPOINT [ "/entrypoint.sh" ]

和脚本/entrypoint.sh脚本

#!/bin/sh -l

echo "Running action"
cd /usr/src/app && yarn start
oipij1gg

oipij1gg2#

编辑添加;

根据通过更改入口点解决的问题,似乎node:16-alpine entrypoint试图运行yarn through node,而不是shell。
虽然现在已经可以运行了,但最好记住,您的入口点并不总是sh。虽然从设置为脚本的入口点开始是一个很好的模式,但对原始CMD的类似修复是ENTRYPOINT ["/bin/sh", "-c"]

原创

docker build可能“完成”良好(读作:没有错误),但是yarn install可以静默地失败,i.也就是说,它可能无法正确安装,但退出0 --所以您构建可以“成功”,而不是 * 实际上成功 *。至少,尝试docker run --rm -it my-test-image sh跳转到完成构建的shell中,并确认它实际上正确构建。
我怀疑基础镜像中安装的yarn版本与您的配置目标版本之间存在差异,因此如果安装失败,您可能需要在安装之前更新yarn。

  • 附带说明 ,你不需要使用另一个仓库(User/other-repo)来调用它,你可以从包含它的仓库中测试/调用action,uses: ./会在你的仓库的./中使用一个action.y[a]ml 例如 *。用一个工作流来测试这个动作是一个很好的实践,这个工作流可以是发布这个动作的存储库上的CI工作流。

相关问题