Docker中的NodeJS – 无法访问node_modules

我们有一个NodeJS项目,在Docker容器内部使用Jenkins。

问题是图像开始后 – 我们有一个错误:

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) 

在jenkins生成期间 – 我检查权限,他们是确定的:

 ... + 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 ... 

但是从容器 – 有“ 权限被拒绝 ”的错误:

 admin@swarm-master-EB25F3D5-0:~$ docker run -ti automation/cms-transform-layer bash app@3b86a8e8cc4d:~$ 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" ... 

这是Jenkinspipe道脚本:

 ... 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' ... 

解决scheme。

我按照Patric和一些资源的build议,将所有Node的构build逻辑从Jenkin的脚本移到Dockerfile。

所以,最终的结果是 – 从Jenkins调用Docker构build:

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

然后,我从Dockerfile执行NPM构build:

 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这样的less量冗余步骤/层次,但是这是有效的。