【问题标题】:Simple CircleCI 2.0 configuration fails for global NPM package installation全局 NPM 包安装的简单 CircleCI 2.0 配置失败
【发布时间】:2021-04-10 05:47:31
【问题描述】:

我有一个运行良好的 Dockerfile:

FROM node:10
RUN npm set unsafe-perm true
RUN npm install -g '@oresoftware/r2g@0.0.132'

但与上述 Dockerfile 相同的 CircleCI config.yml 文件不起作用:

{
  "version": 2,
  "jobs": {
    "build": {
      "docker": [
        {
          "image": "circleci/node:10"
        }
      ],
      "steps": [
        {
          "run": "npm set unsafe-perm true"
        },
        {
          "run": "npm install -g --loglevel=warn '@oresoftware/r2g@0.0.132'"
        }
      ]
    }
  }
}

我在使用上述 config.yml 文件的 CircleCI 上收到以下错误:

#!/bin/bash -eo pipefail
npm install -g --loglevel=warn @oresoftware/r2g
npm WARN checkPermissions Missing write access to /usr/local/lib/node_modules
npm ERR! path /usr/local/lib/node_modules
npm ERR! code EACCES
npm ERR! errno -13
npm ERR! syscall access
npm ERR! Error: EACCES: permission denied, access '/usr/local/lib/node_modules'
npm ERR!  { [Error: EACCES: permission denied, access '/usr/local/lib/node_modules']
npm ERR!   stack:
npm ERR!    'Error: EACCES: permission denied, access \'/usr/local/lib/node_modules\'',
npm ERR!   errno: -13,
npm ERR!   code: 'EACCES',
npm ERR!   syscall: 'access',
npm ERR!   path: '/usr/local/lib/node_modules' }
npm ERR! 
npm ERR! The operation was rejected by your operating system.
npm ERR! It is likely you do not have the permissions to access this file as the current user
npm ERR! 
npm ERR! If you believe this might be a permissions issue, please double-check the
npm ERR! permissions of the file and its containing directories, or try running
npm ERR! the command again as root/Administrator (though this is not recommended).

npm ERR! A complete log of this run can be found in:
npm ERR!     /home/circleci/.npm/_logs/2018-06-18T18_26_53_651Z-debug.log
Exited with code 243

CircleCI 2.0 应该使用 Docker,所以我不确定为什么会发生此权限错误。

【问题讨论】:

  • 请注意,我不应该为此使用sudo,但如果我确实使用sudo,在CircleCI 上也会失败并出现不同的权限错误。
  • 只是好奇,我自己是 CircleCI 的新用户 - 你不是两次执行相同的步骤吗?一次在 Docker 构建中,一次在 CircleCI 步骤中?你不应该只做一次吗? (我会在 CircleCI 步骤中说)
  • 我不确定你的意思,在上面的配置中,"steps""build" 的一部分,对吧?
  • 我可能会误解,但我假设 Docker 映像将构建并在构建时执行这两个 RUN npm 步骤,然后 CircleCI 将尝试在 Docker 映像上分别执行 steps 下的操作- 与构建映像时已经运行的步骤基本相同。
  • 啊Dockerfiles不完全一样,你发布的那个是从node:10派生的,圈子上用的是circleci/node:10。不同之处在于,circleci 节点镜像落入circleci 用户,因此失去了root 权限。这在circleci/node docker hub page (point 4 under the heading "Why") 中有描述。所以相当于node-based image would look like this。这个 dockerfile 产生与 circle 相同的结果。

标签: node.js docker npm circleci circleci-2.0


【解决方案1】:

tldr - 使用以下前缀:

npm install --prefix=$HOME/.local --global serverless
  • serverless 替换为您自己的全局包要求。

背景:

  • 经过一些实验,上述方法似乎是我发现的最干净的方法。
  • CircleCI 的当前circleci/node:lts-buster 图像在路径上有以下内容:

    /home/circleci/.local/bin:/home/circleci/bin:/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin

  • 由于写入权限受阻,我无法写入 /home/circleci/bin

  • 我可以写信给/home/circleci/.local/bin
  • --prefix=$HOME/.local 选项添加到npm install 命令意味着全局包随后安装到/home/circleci/.local/bin
  • 安装后,该命令(在我的例子中为 serverless)是可执行的。

【讨论】:

    【解决方案2】:

    如前所述,上面的 Dockerfile 与 CircleCI-config 中的不完全相同。在 Dockerfile 中,基本映像是 node,默认情况下在 root 用户下运行。

    另一方面,circleci/node 图像落到无特权的circleci 用户手中。因此,基于node 映像的 100% 相同的 Dockerfile 如下所示:

    FROM node:10
    RUN useradd -m circleci
    USER circleci
    RUN npm set unsafe-perm true
    RUN npm install -g '@oresoftware/r2g@0.0.132'
    

    使用此 Dockerfile 会出现与 CircleCI 中相同的错误。

    一个解决方案是使用sudo,问题是你必须在每个使用你安装的节点包的命令上使用sudo(因为使用sudo它实际上会安装在/root 目录,circleci 用户无法访问)。

    我认为更好的选择是将软件包安装在 circleci 主目录中。

    {
      "version": 2,
      "jobs": {
        "build": {
          "docker": [
            {
              "image": "circleci/node:10"
            }
          ],
          "steps": [
            {
              "run": "npm set prefix=/home/circleci/npm && echo 'export PATH=$HOME/circleci/npm/bin:$PATH' >> /home/circleci/.bashrc"
            },
            {
              "run": "npm install -g --loglevel=warn '@oresoftware/r2g@0.0.132'"
            }
          ]
        }
      }
    }
    

    这样您就不必每次使用该软件包时都sudo

    【讨论】:

    • Wtf 确实,但用户是 circleci?也许环境变量设置在其他地方?
    【解决方案3】:

    在 CircleCI 上,您需要使用 sudo。默认用户为circleci,具有无密码sudo 访问权限。

    【讨论】:

      【解决方案4】:

      对我有用的是将以下环境变量添加到作业中:

      environment:
        NPM_CONFIG_PREFIX: "~/.npm-global"
      

      并在一个步骤中修改 $PATH 如下:

      steps: 
        - echo 'export PATH=~/.npm-global/bin:$PATH' >> $BASH_ENV
        - npm install
        - npm install -g some-global-package
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2019-09-15
        • 2021-04-13
        • 1970-01-01
        • 1970-01-01
        • 2017-11-05
        • 2020-10-23
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多