簡體   English   中英

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

[英]How can I run jshint in my CI using Docker

我正在嘗試在我們的 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系統會以可以運行命令的用戶身份檢出源碼樹),然后就可以使用這個原生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"

上面的錯誤是因為/home/node目錄在默認節點映像中歸節點用戶所有。 /app目錄由 root 創建和擁有。 有關更多信息,請參閱有關上述錯誤的未解決問題

我用你的撰寫文件重現了同樣的錯誤。 當我將用戶更改為 root 時。 錯誤消失了。

因此,您可以嘗試在撰寫文件中將用戶更改為root而不是node

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

正如大衛指出的那樣,您還需要將 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

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM