【问题标题】:How can I run jshint in my CI using Docker如何使用 Docker 在我的 CI 中运行 jshint
【发布时间】:2021-01-22 12:32:38
【问题描述】:

我正在尝试在我们的 Azure 管道中创建一个任务来验证我们的 javascript。 我们有一个节点容器,它在启动时执行 npm 安装:

  node:
    image: node:12-alpine
    user: "node"
    working_dir: /home/node/app
    environment:
      - NODE_ENV=development
    volumes:
      - ./:/home/node/app
    expose:
      - "8081"
    command: "npm install"

为了执行我的任务,我在 Makefile 中创建了一个 make 命令:

js-check: ## Run Jshint
    docker-compose run node npm install && npm run jshint

然后我在构建作业中调用如下:

- script: make js-check
            displayName: 'Run JSHint'

当我在本地调用 make js-check 时,它会执行安装,然后是输出 0 个发现的漏洞的 jshint。但是,当管道远程到达此任务时,它无法声称缺少对 /home/node/app 的写访问权限

npm WARN checkPermissions Missing write access to /home/node/app
npm ERR! code EACCES
npm ERR! syscall access
npm ERR! path /home/node/app
npm ERR! errno -13
npm ERR! Error: EACCES: permission denied, access '/home/node/app'
npm ERR!  [Error: EACCES: permission denied, access '/home/node/app'] {
npm ERR!   errno: -13,
npm ERR!   code: 'EACCES',
npm ERR!   syscall: 'access',
npm ERR!   path: '/home/node/app'
npm ERR! }
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.

【问题讨论】:

  • 嗨,您有机会查看以下解决方案吗?你过得怎么样?

标签: node.js docker makefile azure-pipelines jshint


【解决方案1】:

你的 Makefile 运行两个命令; shell 在到达 Docker 之前会解释 && 标记。该命令相当于:

js-check: ## Run Jshint
        docker-compose run node npm install
        npm run jshint # (without Docker)

看起来您的环境已经安装了 Node。你需要解决权限问题(一般CI系统会把源码树作为可以运行命令的用户检出),然后你就可以使用这个原生Node了:

js-install: package.json
        npm install
js-check: js-install
        npm run jshint

这样做的好处是只依赖普通的Javascript开发工具;您不需要额外的 docker-compose.yml 文件或管理员权限来运行您的单元测试。

如果你真的需要在 Docker 中运行它,你可以将它作为两个单独的命令运行,或者使单个容器命令成为一个可以解释 && 本身的 shell:

js-install1: package.json docker-compose.yml
        docker-compose run node npm install
js-check1: js-install1
        docker-compose run node npm run jshint
js-check2: package.json docker-compose.yml
        docker-compose run node \
          sh -c "npm install && npm run jshint"

【讨论】:

    【解决方案2】:

    上述错误是因为/home/node 目录归默认节点映像中的节点用户所有。 /app 目录由 root 创建并拥有。有关上述错误的更多信息,请参阅此open issue

    我在您的撰写文件中重现了同样的错误。当我将用户更改为root时。错误消失了。

    因此,您可以尝试在撰写文件中将用户更改为 root 而不是 node

     node:
        image: node:12-alpine
        user: "root"
        working_dir: /home/node/app
    

    正如 David 所指出的,您还需要将您的 makefile 更改为 docker-compose run node sh -c "npm install && npm run jshint"。如果你想在 docker 中运行命令。

    另一种解决方法是从 dockerfile 而不是 compose 文件构建和运行容器。请参阅下面的简单示例 dockerfile。

    from node:12-alpine
    ENV NODE_ENV=development
    RUN mkdir -p /home/node/app 
    RUN chown -R node:node /home/node/app
    USER node
    WORKDIR /home/node/app
    COPY . ./
    RUN npm install
    CMD [ "npm", "run", "jshint" ]
    

    然后像示例一样更改 Makefile:

    js-check: ## Run Jshint
        docker build --tag nodejshint:1.0 . && docker run --detach --name jshintContainer nodejshint:1.0
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2016-06-24
      • 1970-01-01
      • 2020-06-15
      • 2021-10-17
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-03-08
      相关资源
      最近更新 更多