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