如何使用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检查时,它会执行安装,然后是输出发现的0个漏洞的jshint。然而,当管道远程到达该任务时,它无法声明对/home/note/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之前解释CCD_ 1标记。该命令相当于:

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创建并拥有。有关更多信息,请参阅关于上述错误的公开问题。

我在你的作文文件中重复了同样的错误。当我将用户更改为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

相关内容

  • 没有找到相关文章

最新更新