微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

如何使用Docker在我的CI中运行jshint

如何解决如何使用Docker在我的CI中运行jshint

我正在尝试在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时,它会执行安装,然后是jshint,它会输出发现的0个漏洞。但是,当管道远程完成此任务时,它无法声明缺少对/ 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.

解决方法

您的Makefile运行两个命令; shell在进入Docker之前先解释&&标记。该命令等效于:

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

您的环境似乎已经安装了Node。您需要解决权限问题(通常,CI系统将以可以运行命令的用户身份检出源树),然后可以使用此本机节点:

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"
,

上面的错误是因为/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

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。