nodeshift-archived/centos7-s2i-nodejs

Can't resolve devDependencies when running npm scripts in container?

lincolnthree opened this issue · 28 comments

Hey folks,

Not exactly sure if this is user error, something I've missed, or a bug... but... here goes:

Essentially I am having trouble getting an S2I build to run because some things seem to be missing, and I'm not sure why.

The image build actually succeeds, but when the node app actually spins up and starts running NPM_RUN scripts, it fails to find things like "rimraf" and "cpy" which are specified as devDependencies in the package.json file. I've even tried manually running npm install in the container, as well.

git version 2.9.3
Environment: 
	DEV_MODE=false
	NODE_ENV=production
	DEBUG_PORT=5858
Running as user uid=1000140000 gid=0(root) groups=0(root),1000140000
Launching via npm...
npm info it worked if it ends with ok
npm info using npm@5.6.0
npm info using node@v10.1.0
npm info lifecycle launcher-frontend@0.0.7~prestart:openshift: launcher-frontend@0.0.7
npm info lifecycle launcher-frontend@0.0.7~start:openshift: launcher-frontend@0.0.7
> launcher-frontend@0.0.7 start:openshift /opt/app-root/src
> npm run setup && npm run build:prod
npm info it worked if it ends with ok
npm info using npm@5.6.0
npm info using node@v10.1.0
npm info lifecycle launcher-frontend@0.0.7~presetup: launcher-frontend@0.0.7
npm info lifecycle launcher-frontend@0.0.7~setup: launcher-frontend@0.0.7
> launcher-frontend@0.0.7 setup /opt/app-root/src
> npm install
npm info it worked if it ends with ok
npm info using npm@5.6.0
npm info using node@v10.1.0
npm info lifecycle launcher-frontend@0.0.7~preinstall: launcher-frontend@0.0.7
npm http fetch GET 200 https://registry.npmjs.org/rhoaster  172ms
npm http fetch GET 200 https://registry.npmjs.org/nodeshift  179ms
npm http fetch GET 200 https://registry.npmjs.org/openshift-config-loader  38ms
npm http fetch GET 200 https://registry.npmjs.org/openshift-rest-client  38ms
npm http fetch GET 200 https://registry.npmjs.org/openshift-rest-client/-/openshift-rest-client-1.1.1.tgz  34ms
npm http fetch GET 200 https://registry.npmjs.org/yargs  57ms
npm http fetch GET 200 https://registry.npmjs.org/openshift-config-loader  81ms
npm http fetch GET 200 https://registry.npmjs.org/git-repo-info  88ms
npm http fetch GET 200 https://registry.npmjs.org/js-yaml  89ms
npm http fetch GET 200 https://registry.npmjs.org/chalk  94ms
npm http fetch GET 200 https://registry.npmjs.org/find-up  31ms
npm http fetch GET 200 https://registry.npmjs.org/cliui  32ms
npm http fetch GET 200 https://registry.npmjs.org/string-width  24ms
npm http fetch GET 200 https://registry.npmjs.org/which-module  28ms
npm http fetch GET 200 https://registry.npmjs.org/yargs-parser  29ms
npm http fetch GET 200 https://registry.npmjs.org/openshift-rest-client  126ms
npm http fetch GET 200 https://registry.npmjs.org/rimraf  128ms
npm http fetch GET 200 https://registry.npmjs.org/tar  129ms
npm http fetch GET 200 https://registry.npmjs.org/esprima  35ms
npm http fetch GET 200 https://registry.npmjs.org/ansi-styles  38ms
npm http fetch GET 200 https://registry.npmjs.org/locate-path  34ms
npm http fetch GET 200 https://registry.npmjs.org/supports-color  39ms
npm http fetch GET 200 https://registry.npmjs.org/strip-ansi  26ms
npm http fetch GET 200 https://registry.npmjs.org/os-locale  87ms
npm http fetch GET 200 https://registry.npmjs.org/is-fullwidth-code-point  25ms
npm http fetch GET 200 https://registry.npmjs.org/camelcase  25ms
npm http fetch GET 200 https://registry.npmjs.org/chownr  34ms
npm http fetch GET 200 https://registry.npmjs.org/fs-minipass  36ms
npm http fetch GET 200 https://registry.npmjs.org/minipass  36ms
npm http fetch GET 200 https://registry.npmjs.org/minizlib  33ms
npm http fetch GET 200 https://registry.npmjs.org/safe-buffer  34ms
npm http fetch GET 200 https://registry.npmjs.org/yallist  35ms
npm http fetch GET 200 https://registry.npmjs.org/p-locate  29ms
npm http fetch GET 200 https://registry.npmjs.org/glob  31ms
npm http fetch GET 200 https://registry.npmjs.org/path-exists  25ms
npm http fetch GET 200 https://registry.npmjs.org/has-flag  41ms
npm http fetch GET 200 https://registry.npmjs.org/ansi-regex  41ms
npm http fetch GET 200 https://registry.npmjs.org/execa  41ms
npm http fetch GET 200 https://registry.npmjs.org/mem  39ms
npm http fetch GET 200 https://registry.npmjs.org/p-limit  26ms
npm http fetch GET 200 https://registry.npmjs.org/npm-run-path  27ms
npm http fetch GET 200 https://registry.npmjs.org/mimic-fn  28ms
npm http fetch GET 200 https://registry.npmjs.org/get-stream  29ms
npm http fetch GET 200 https://registry.npmjs.org/p-try  25ms
npm http fetch GET 200 https://registry.npmjs.org/p-finally  31ms
npm http fetch GET 200 https://registry.npmjs.org/strip-eof  31ms
npm http fetch GET 200 https://registry.npmjs.org/cross-spawn  32ms
npm http fetch GET 200 https://registry.npmjs.org/path-key  23ms
npm http fetch GET 200 https://registry.npmjs.org/shebang-command  22ms
npm http fetch GET 200 https://registry.npmjs.org/shebang-regex  19ms
npm WARN read-shrinkwrap This version of npm is compatible with lockfileVersion@1, but npm-shrinkwrap.json was generated for lockfileVersion@0. I'll try to do my best with it!
npm WARN read-shrinkwrap This version of npm is compatible with lockfileVersion@1, but npm-shrinkwrap.json was generated for lockfileVersion@0. I'll try to do my best with it!
npm info linkStuff launcher-frontend@0.0.7
npm info lifecycle launcher-frontend@0.0.7~install: launcher-frontend@0.0.7
npm info lifecycle launcher-frontend@0.0.7~postinstall: launcher-frontend@0.0.7
> launcher-frontend@0.0.7 postinstall /opt/app-root/src
> echo 'All done!'
All done!
npm info lifecycle undefined~preshrinkwrap: undefined
npm info lifecycle undefined~shrinkwrap: undefined
npm info lifecycle undefined~postshrinkwrap: undefined
npm WARN ngx-modal@0.0.29 requires a peer of @angular/core@^2.0.0 but none is installed. You must install peer dependencies yourself.
npm WARN ngx-modal@0.0.29 requires a peer of @angular/router@^3.0.0 but none is installed. You must install peer dependencies yourself.
up to date in 2.952s
┌───────────────────────────────────────────────────────────────┐
│                    npm update check failed                    │
│              Try running with sudo or get access              │
│             to the local update config store via              │
│ sudo chown -R $USER:$(id -gn $USER) /opt/app-root/src/.config │
└───────────────────────────────────────────────────────────────┘
npm info ok 
npm info lifecycle launcher-frontend@0.0.7~postsetup: launcher-frontend@0.0.7
┌───────────────────────────────────────────────────────────────┐
│                    npm update check failed                    │
│              Try running with sudo or get access              │
│             to the local update config store via              │
│ sudo chown -R $USER:$(id -gn $USER) /opt/app-root/src/.config │
└───────────────────────────────────────────────────────────────┘
npm info ok 
npm info it worked if it ends with ok
npm info using npm@5.6.0
npm info using node@v10.1.0
npm info lifecycle launcher-frontend@0.0.7~prebuild:prod: launcher-frontend@0.0.7
> launcher-frontend@0.0.7 prebuild:prod /opt/app-root/src
> npm run clean-and-copy
npm info it worked if it ends with ok
npm info using npm@5.6.0
npm info using node@v10.1.0
npm info lifecycle launcher-frontend@0.0.7~preclean-and-copy: launcher-frontend@0.0.7
npm info lifecycle launcher-frontend@0.0.7~clean-and-copy: launcher-frontend@0.0.7
> launcher-frontend@0.0.7 clean-and-copy /opt/app-root/src
> npm run clean-dist && npm run copy-files
npm info it worked if it ends with ok
npm info using npm@5.6.0
npm info using node@v10.1.0
npm info lifecycle launcher-frontend@0.0.7~preclean-dist: launcher-frontend@0.0.7
npm info lifecycle launcher-frontend@0.0.7~clean-dist: launcher-frontend@0.0.7
> launcher-frontend@0.0.7 clean-dist /opt/app-root/src
> rimraf dist
sh: rimraf: command not found
npm info lifecycle launcher-frontend@0.0.7~clean-dist: Failed to exec clean-dist script
npm ERR! file sh
npm ERR! code ELIFECYCLE
npm ERR! errno ENOENT
npm ERR! syscall spawn
npm ERR! launcher-frontend@0.0.7 clean-dist: `rimraf dist`
npm ERR! spawn ENOENT
npm ERR! 
npm ERR! Failed at the launcher-frontend@0.0.7 clean-dist script.
npm ERR! This is probably not a problem with npm. There is likely additional logging output above.
┌───────────────────────────────────────────────────────────────┐
│                    npm update check failed                    │
│              Try running with sudo or get access              │
│             to the local update config store via              │
│ sudo chown -R $USER:$(id -gn $USER) /opt/app-root/src/.config │
└───────────────────────────────────────────────────────────────┘
npm ERR! A complete log of this run can be found in:
npm ERR!     /opt/app-root/src/.npm/_logs/2018-05-17T17_33_56_057Z-debug.log
npm info lifecycle launcher-frontend@0.0.7~clean-and-copy: Failed to exec clean-and-copy script
npm ERR! code ELIFECYCLE
npm ERR! errno 1
npm ERR! launcher-frontend@0.0.7 clean-and-copy: `npm run clean-dist && npm run copy-files`
npm ERR! Exit status 1
npm ERR! 
npm ERR! Failed at the launcher-frontend@0.0.7 clean-and-copy script.
npm ERR! This is probably not a problem with npm. There is likely additional logging output above.
┌───────────────────────────────────────────────────────────────┐
│                    npm update check failed                    │
│              Try running with sudo or get access              │
│             to the local update config store via              │
│ sudo chown -R $USER:$(id -gn $USER) /opt/app-root/src/.config │
└───────────────────────────────────────────────────────────────┘
npm ERR! A complete log of this run can be found in:
npm ERR!     /opt/app-root/src/.npm/_logs/2018-05-17T17_33_56_105Z-debug.log
npm info lifecycle launcher-frontend@0.0.7~prebuild:prod: Failed to exec prebuild:prod script
npm ERR! code ELIFECYCLE
npm ERR! errno 1
npm ERR! launcher-frontend@0.0.7 prebuild:prod: `npm run clean-and-copy`
npm ERR! Exit status 1
npm ERR! 
npm ERR! Failed at the launcher-frontend@0.0.7 prebuild:prod script.
npm ERR! This is probably not a problem with npm. There is likely additional logging output above.
┌───────────────────────────────────────────────────────────────┐
│                    npm update check failed                    │
│              Try running with sudo or get access              │
│             to the local update config store via              │
│ sudo chown -R $USER:$(id -gn $USER) /opt/app-root/src/.config │
└───────────────────────────────────────────────────────────────┘
npm ERR! A complete log of this run can be found in:
npm ERR!     /opt/app-root/src/.npm/_logs/2018-05-17T17_33_56_142Z-debug.log
npm info lifecycle launcher-frontend@0.0.7~start:openshift: Failed to exec start:openshift script
npm ERR! code ELIFECYCLE
npm ERR! errno 1
npm ERR! launcher-frontend@0.0.7 start:openshift: `npm run setup && npm run build:prod`
npm ERR! Exit status 1
npm ERR! 
npm ERR! Failed at the launcher-frontend@0.0.7 start:openshift script.
npm ERR! This is probably not a problem with npm. There is likely additional logging output above.
┌───────────────────────────────────────────────────────────────┐
│                    npm update check failed                    │
│              Try running with sudo or get access              │
│             to the local update config store via              │
│ sudo chown -R $USER:$(id -gn $USER) /opt/app-root/src/.config │
└───────────────────────────────────────────────────────────────┘
npm ERR! A complete log of this run can be found in:
npm ERR!     /opt/app-root/src/.npm/_logs/2018-05-17T17_33_56_180Z-debug.log

I'm not a node expert so I'm a bit at a loss.

This is the repo: https://github.com/snowdrop/snowdrop-site-angular (deployment instructions I'm using are in the readme.)

These are the commands to run the S2I build that I'm using:

find . | grep openshiftio | grep application | xargs -n 1 oc apply -f
oc new-app --template=snowdrop-site-angular

Any insight would be appreciated!

@lincolnthree by default, we do a "production" install, which doesn't install devDepencies
If you add NODE_ENV=development to your deploy, it will install dev dependecies during deployment

or move those devDepencies to regular dependencies

Hey @lholmquist ! Thanks. I actually just tried that and got a little farther (Yay!), but it's failing to install dependencies because there's no FS access now:

npm ERR! path /opt/app-root/src/node_modules
npm ERR! code EACCES
npm ERR! errno -13
npm ERR! syscall access
npm ERR! Error: EACCES: permission denied, access '/opt/app-root/src/node_modules'
npm ERR!  { Error: EACCES: permission denied, access '/opt/app-root/src/node_modules'
npm ERR!   stack: 'Error: EACCES: permission denied, access \'/opt/app-root/src/node_modules\'',
npm ERR!   errno: -13,
npm ERR!   code: 'EACCES',
npm ERR!   syscall: 'access',
npm ERR!   path: '/opt/app-root/src/node_modules' }
npm ERR! 
npm ERR! Please try running this command again as root/Administrator.

Ideas about this one?

I see it's already running as root user, so not sure what's happening:

+ echo -e 'Running as user uid=1000140000 gid=0(root) groups=0(root),1000140000'
--
  | + '[' true == true ']'
  | + echo 'Installing dev dependencies...'
  | + npm install

Full log:

+ export GIT_COMMITTER_NAME=unknown
+ GIT_COMMITTER_NAME=unknown
+ export and GIT_COMMITTER_EMAIL=unknown@localhost.com
+ GIT_COMMITTER_EMAIL=unknown@localhost.com
+ git --version
git version 2.9.3
+ '[' '' == --debug ']'
+ run_node
+ echo -e 'Environment: \n\tDEV_MODE=true\n\tNODE_ENV=development\n\tDEBUG_PORT=5858'
Environment: 
	DEV_MODE=true
	NODE_ENV=development
	DEBUG_PORT=5858
++ id
+ echo -e 'Running as user uid=1000140000 gid=0(root) groups=0(root),1000140000'
+ '[' true == true ']'
+ echo 'Installing dev dependencies...'
+ npm install
Running as user uid=1000140000 gid=0(root) groups=0(root),1000140000
Installing dev dependencies...
npm info it worked if it ends with ok
npm info using npm@5.6.0
npm info using node@v10.1.0
npm info lifecycle launcher-frontend@0.0.7~preinstall: launcher-frontend@0.0.7
npm http fetch GET 200 https://registry.npmjs.org/rhoaster  170ms
npm http fetch GET 200 https://registry.npmjs.org/nodeshift  180ms
npm http fetch GET 200 https://registry.npmjs.org/openshift-config-loader  52ms
npm http fetch GET 200 https://registry.npmjs.org/openshift-rest-client  53ms
npm http fetch GET 200 https://registry.npmjs.org/yargs  38ms
npm http fetch GET 200 https://registry.npmjs.org/openshift-rest-client/-/openshift-rest-client-1.1.1.tgz  42ms
npm http fetch GET 200 https://registry.npmjs.org/openshift-config-loader  94ms
npm http fetch GET 200 https://registry.npmjs.org/git-repo-info  99ms
npm http fetch GET 200 https://registry.npmjs.org/cliui  50ms
npm http fetch GET 200 https://registry.npmjs.org/js-yaml  116ms
npm http fetch GET 200 https://registry.npmjs.org/find-up  52ms
npm http fetch GET 200 https://registry.npmjs.org/chalk  126ms
npm http fetch GET 200 https://registry.npmjs.org/os-locale  53ms
npm http fetch GET 200 https://registry.npmjs.org/string-width  55ms
npm http fetch GET 200 https://registry.npmjs.org/openshift-rest-client  159ms
npm http fetch GET 200 https://registry.npmjs.org/rimraf  159ms
npm http fetch GET 200 https://registry.npmjs.org/which-module  59ms
npm http fetch GET 200 https://registry.npmjs.org/tar  168ms
npm http fetch GET 200 https://registry.npmjs.org/yargs-parser  65ms
npm http fetch GET 200 https://registry.npmjs.org/strip-ansi  68ms
npm http fetch GET 200 https://registry.npmjs.org/esprima  67ms
npm http fetch GET 304 https://registry.npmjs.org/string-width  81ms (from cache)
npm http fetch GET 200 https://registry.npmjs.org/ansi-styles  56ms
npm http fetch GET 200 https://registry.npmjs.org/locate-path  64ms
npm http fetch GET 200 https://registry.npmjs.org/supports-color  55ms
npm http fetch GET 200 https://registry.npmjs.org/execa  52ms
npm http fetch GET 200 https://registry.npmjs.org/mem  64ms
npm http fetch GET 200 https://registry.npmjs.org/is-fullwidth-code-point  64ms
npm http fetch GET 200 https://registry.npmjs.org/fs-minipass  60ms
npm http fetch GET 200 https://registry.npmjs.org/chownr  66ms
npm http fetch GET 200 https://registry.npmjs.org/glob  74ms
npm http fetch GET 200 https://registry.npmjs.org/minipass  70ms
npm http fetch GET 200 https://registry.npmjs.org/safe-buffer  62ms
npm http fetch GET 200 https://registry.npmjs.org/minizlib  68ms
npm http fetch GET 200 https://registry.npmjs.org/yallist  56ms
npm http fetch GET 200 https://registry.npmjs.org/camelcase  49ms
npm http fetch GET 200 https://registry.npmjs.org/p-locate  47ms
npm http fetch GET 200 https://registry.npmjs.org/ansi-regex  55ms
npm http fetch GET 200 https://registry.npmjs.org/has-flag  41ms
npm http fetch GET 200 https://registry.npmjs.org/path-exists  44ms
npm http fetch GET 200 https://registry.npmjs.org/cross-spawn  46ms
npm http fetch GET 200 https://registry.npmjs.org/get-stream  46ms
npm http fetch GET 200 https://registry.npmjs.org/npm-run-path  45ms
npm http fetch GET 200 https://registry.npmjs.org/p-finally  44ms
npm http fetch GET 200 https://registry.npmjs.org/strip-eof  44ms
npm http fetch GET 200 https://registry.npmjs.org/mimic-fn  40ms
npm http fetch GET 200 https://registry.npmjs.org/p-limit  32ms
npm http fetch GET 200 https://registry.npmjs.org/shebang-command  23ms
npm http fetch GET 200 https://registry.npmjs.org/path-key  28ms
npm http fetch GET 200 https://registry.npmjs.org/p-try  22ms
npm http fetch GET 200 https://registry.npmjs.org/shebang-regex  21ms
npm WARN read-shrinkwrap This version of npm is compatible with lockfileVersion@1, but npm-shrinkwrap.json was generated for lockfileVersion@0. I'll try to do my best with it!
npm WARN read-shrinkwrap This version of npm is compatible with lockfileVersion@1, but npm-shrinkwrap.json was generated for lockfileVersion@0. I'll try to do my best with it!
npm WARN checkPermissions Missing write access to /opt/app-root/src/node_modules
npm WARN ngx-modal@0.0.29 requires a peer of @angular/core@^2.0.0 but none is installed. You must install peer dependencies yourself.
npm WARN ngx-modal@0.0.29 requires a peer of @angular/router@^3.0.0 but none is installed. You must install peer dependencies yourself.
npm ERR! path /opt/app-root/src/node_modules
npm ERR! code EACCES
npm ERR! errno -13
npm ERR! syscall access
npm ERR! Error: EACCES: permission denied, access '/opt/app-root/src/node_modules'
npm ERR!  { Error: EACCES: permission denied, access '/opt/app-root/src/node_modules'
npm ERR!   stack: 'Error: EACCES: permission denied, access \'/opt/app-root/src/node_modules\'',
npm ERR!   errno: -13,
npm ERR!   code: 'EACCES',
npm ERR!   syscall: 'access',
npm ERR!   path: '/opt/app-root/src/node_modules' }
npm ERR! 
npm ERR! Please try running this command again as root/Administrator.
┌───────────────────────────────────────────────────────────────┐
│                    npm update check failed                    │
│              Try running with sudo or get access              │
│             to the local update config store via              │
│ sudo chown -R $USER:$(id -gn $USER) /opt/app-root/src/.config │
└───────────────────────────────────────────────────────────────┘
npm ERR! A complete log of this run can be found in:
npm ERR!     /opt/app-root/src/.npm/_logs/2018-05-17T17_57_31_287Z-debug.log
lance commented

@lincolnthree I have been traveling a bit and will be able to spend more time on this soon, but for now, I have a suspicion about something. If you were to remove all of the artifacts from this project (deployment configs, build configs, builds, image streams, routes and services), then redeploy, does the problem still occur?

Trying with a delete.

It worked! Thanks @lance . Interesting. Why is this the case?

Also, I hope your talk went well today :)

The view at that speaker's dinner looked.... stunning.

lance commented

@lincolnthree I haven't looked at your project to see exactly what you are doing, but here is my theory.

When you deploy an application more than once, the assemble script tries to be smart and will use the node_modules directory from previous installs in order to save on deployment time https://github.com/bucharest-gold/centos7-s2i-nodejs/blob/master/s2i/assemble#L42-L49. I think this might be the problem. And in spite of the fact that you are in the root group (look closely at that line, you're not root - just in the group), the permissions from the previous install seem to be insufficient. I will poke around with it more today after my talk and see what I can find.

My first talk yesterday went really well - thanks for asking!

lance commented

@lincolnthree since you had success after removing the previous build configuration and other artifacts, does the problem still occur when you try to rebuild?

Checking...

It fails with the same error. Interesting.

lance commented

@lincolnthree I took a look at your package.json and I have to say... that's a complicated build! Can you help me out by explaining how your build works - or even providing a simpler sample project where I can easily reproduce the error within a test case?

@lance Yeah I'm simplifying it now. I forked from another project (Fabric8 launcher-frontend). I've been trying to cut out the stuff that's not necessary.

Basically just:

npm install
npm run build:prod
npm run start:prod

"build:prod": "webpack --config config/webpack.prod.js -p",
"start:prod": "node scripts/prod-server.js",

That's all that should be necessary.

@lance I'm having some other strange issues now. E.g. the image no longer seems to respect my .s2i/environment file. It's running some other commands and I don't really know what or why.

E.g. It seems to run npm install again in the deployment of the final image. Even after it's already done that during the image build. And it's not calling my NPM_RUN= (I know because I deleted the run script it references and it's still doing the same thing and not complaining.)

@lance The s2I image build step just seems to run the npm install and then postinstall scripts. Nothing else.

The strange part with that is I could swear it had been respecting this configuration before.

Ah. Apparently after reading through the S2I scripts, NPM_RUN is only respected in "production" NODE_ENV... seems like it should be respected in "development" as well?

lance commented

@lincolnthree yeah, so in dev mode we run nodemon which looks at the main property in package.json. Can you try adding a main: scripts/prod_server.js line in your package.json to see if that helps?

lance commented

@lincolnthree how are things with this?

So far so good. I figured out how to use the BuildConfig env: vars to control the node env for build vs. deploy. That seems to be the most reasonable solution. That said, I think there does need to be a way to configure nodemon to target a script in the package.json, not main. As main.js is often used for specifying actual code entry points, not build entry points, right?

I think the conflation of building vs. deploying/releasing should be avoided, as that's already confusing as hell in node-land.

Thoughts?

lance commented

Closing as resolved, and opening a new issue regarding documentation - referencing #94

@lincolnthree I have been traveling a bit and will be able to spend more time on this soon, but for now, I have a suspicion about something. If you were to remove all of the artifacts from this project (deployment configs, build configs, builds, image streams, routes and services), then redeploy, does the problem still occur?

saw this issue and had the same problem (include first step that worked for both of us) but the:
EACCES: permission denied, access '/opt/app-root/src/node_modules' npm openshift
still occures to me, even when I delete it all..

any ideas?
@lance

lance commented

@OfekRv what version are you using

Im using openshift with node.js 10
if my NODE_EVN is production than I get this:

  | │ npm update check failed │
  | │ Try running with sudo or get access │
  | │ to the local update config store via │
  | │ sudo chown -R $USER:$(id -gn $USER) /opt/app-root/src/.config │

else, if my NODE_ENV defined as development than I get that:

npm ERR! path /opt/app-root/src/node_modules
npm ERR! code EACCES
npm ERR! errno -13
npm ERR! syscall access
npm ERR! Error: EACCES: permission denied, access '/opt/app-root/src/node_modules'
npm ERR! { Error: EACCES: permission denied, access '/opt/app-root/src/node_modules'
npm ERR! stack: 'Error: EACCES: permission denied, access '/opt/app-root/src/node_modules'',
npm ERR! errno: -13,
npm ERR! code: 'EACCES',
npm ERR! syscall: 'access',
npm ERR! path: '/opt/app-root/src/node_modules' }
npm ERR!
npm ERR! Please try running this command again as root/Administrator.

I played a lot with the pods, builds and etc.. didnt work
https://github.com/NatalyShv/Roomates
this is my POC repo that I try to launch on openshift @lance

the same error as @OfekRv has