2017-03-01 76 views
0

我們在Docker容器中使用Jenkins構建了一個NodeJS項目。Docker中的NodeJS - 無法訪問node_modules

圖像開始後的問題是taht - 我們有一個錯誤:

transform_1 | > node ./build/server.js 
transform_1 | 
transform_1 | module.js:472 
transform_1 |  throw err; 
transform_1 | ^
transform_1 | 
transform_1 | Error: Cannot find module './lib/express' 
transform_1 |  at Function.Module._resolveFilename (module.js:470:15) 

在建立詹金斯 - 我檢查的權限,他們是OK:

... 
+ ls -l node_modules/express/lib 
total 80 
-rw-r--r-- 1 jenkins 1001 14202 Feb 28 12:18 application.js 
-rw-r--r-- 1 jenkins 1001 1954 Feb 28 12:18 express.js 
drwxr-xr-x 2 jenkins 1001 4096 Feb 28 12:18 middleware 
... 

但是從容器 - 有「權限被拒絕」 錯誤:

[email protected]:~$ docker run -ti automation/cms-transform-layer bash 
[email protected]:~$ ls -l node_modules/express/ 
ls: cannot access node_modules/express/lib: Permission denied 
ls: cannot access node_modules/express/node_modules: Permission denied 
total 124 
-rw-r--r-- 1 app app 99111 Feb 28 12:18 History.md 
-rw-r--r-- 1 app app 1249 Feb 28 12:18 LICENSE 
-rw-r--r-- 1 app app 4541 Feb 28 12:18 Readme.md 
-rw-r--r-- 1 app app 224 Feb 28 12:18 index.js 
d????????? ? ? ?  ?   ? lib 
d????????? ? ? ?  ?   ? node_modules 
-rw-r--r-- 1 app app 4939 Feb 28 12:18 package.json 

這到底是什麼"d????????? ? ? ? ? ? node_modules"

Dockerfile是:

FROM node:7.5.0 

RUN useradd --user-group --create-home --shell /bin/false app 

ENV HOME=/home/app 

USER root 
COPY . $HOME/ 
RUN chown -R app:app $HOME/* 

USER app 
WORKDIR $HOME 

CMD ["npm", "run", "start:production"] 

UPD

相關條目中package.json

... 
"contentful": "^3.8.0", 
"express": "^4.14.0", 
"jsum": "^0.1.1", 
... 

服務定義從docker-compose.yml

... 
transform: 
environment: 
    - LOGZ_TOKEN="" 
    - LOGZIO_API_KEY="" 
    - NPM_TOKEN="" 
image: "company/transform-layer:latest" 
restart: "always" 
ports: 
    - "3003:3003" 
... 

這是詹金斯管道腳本:

... 
def npmBuildTransform(repoUrl='1', env='2') { 
    docker.image('node').inside('-v /var/run/docker.sock:/var/run/docker.sock') { 
     git branch: "${BRANCH}", credentialsId: 'github', url: "${repoUrl}" 
     stage('Transform build') { 
      sh 'apt-get update && apt-get -y install rsync' 
      sh 'npm config set //registry.npmjs.org/:_authToken=$NPM_TOKEN' 
      sh 'npm install --production=false' 
      ... 
+1

「已解決」:在'docker-compose.yml'文件中的'root' +'permfix'下創建了所有內容。 – setevoy

+0

你是否也可以包含你的package.json腳本和你的docker-compose.yml文件?這是詹金斯管道? –

+0

@PatrickScott謝謝你,帕特里克。更新。我確信在Docker-build期間CI服務器上的用戶出現問題,並且擁有/ jenkins目錄 - 具有ID 1001的'jenkins'用戶和擁有docker-compose容器的dev-server上的用戶('serveradmin'與UID 1000)。但是在構建過程中有'chown -R app'步驟。在這裏,Node的模塊有什麼問題? 請讓我知道,如果你需要更多的信息。我會盡量重現/回滾到明天的錯誤,而我們還沒有很多的構建。 – setevoy

回答

0

的解決方案。

我按照Patricsome資源的建議,將所有Node的構建邏輯從Jenkin的腳本移動到Dockerfile。

所以,最後的結果就是 - 打電話碼頭工人從詹金斯建設:

 ... 
     def appimage = docker.build("projectname/${imgName}:${TAG}", "--build-arg NPM_TOKEN=${NPM_TOKEN} .") 

      appimage.push() 
      appimage.push('latest') 
     ... 

然後我就NPM從Dockerfile建設:

FROM node:7.5.0 

ARG NPM_TOKEN="${NPM_TOKEN}" 

RUN useradd --user-group --create-home --shell /bin/false app 

ENV HOME=/home/app 

USER app 
COPY package.json $HOME/ 

WORKDIR $HOME 
RUN pwd && ls -l 

RUN npm config set //registry.npmjs.org/:_authToken=${NPM_TOKEN} 

RUN npm install --production=false 
COPY . $HOME 

USER root 
RUN chown -R app:app $HOME/ 

USER app 
RUN npm run build:production 

CMD ["npm", "run", "start:production"] 

這是一種 「開發」 的版本,像RUN pwd && ls -l這樣的冗餘步驟/圖層很少,但是可以工作。