2017-03-01 48 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这样的冗余步骤/图层很少,但是可以工作。