Amazon Elastic Beanstalk node and npm non-standard install locations
Solution 1
You can add the most recent node and npm binaries to $PATH with a command like this:
PATH=$PATH:`ls -td /opt/elasticbeanstalk/node-install/node-* | head -1`/bin
I couldn't figure out how to prevent beanstalk commands from resetting the $PATH back again.
If you are so inclined you can probably create a symlink with a command similar to the above and use that as your reference point in cron scripts etc.
Agreed, it is very very annoying.
Solution 2
Following Peter Johnson & Greg Tatum replies I created a symlink to the latest node executable:
container_commands:
01_node_binary:
command: "ln -sf `ls -td /opt/elasticbeanstalk/node-install/node-* | head -1`/bin/node /bin/node"
- I find the latest version of the node install binary
- Out of it I create a symlink in the /bin directory (which is part of the $PATH)
Solution 3
We had a similar issue with "node not found", trying to run node in container commands. After running ps aux
on the EC2 instance we saw that EB has access to the $NODE_HOME
env var:
su -s /bin/sh -c PATH=$PATH:$NODE_HOME/bin $EB_NODE_COMMAND 2>&1 nodejs
This can be used in .ebextensions, e.g.:
container_commands:
your_node_script:
command: 'env PATH="$PATH:$NODE_HOME/bin" ./bin/your_node_script'
(thanks to Alan Grow)
Solution 4
I created the file /.ebextensions/node.config
in my project folder to declare my node version and add symlinks to the /bin folder. More information about the .ebextensions folder can be found here: http://docs.aws.amazon.com/elasticbeanstalk/latest/dg/customize-containers-ec2.html
option_settings:
- option_name: NodeVersion
value: 0.12.2
files:
"/bin/node" :
mode: "755755"
content: "/opt/elasticbeanstalk/node-install/node-v0.12.2-linux-x64/bin/node"
"/bin/npm" :
mode: "755755"
content: "/opt/elasticbeanstalk/node-install/node-v0.12.2-linux-x64/bin/npm"
Solution 5
Amazon Elastic Beanstalk
Grand the access to node command
- sudo su
- vipw
- nodejs:x:496:494::/tmp:/bin/bash (":wq" to save changes)
- sudo su nodejs
- PATH=$PATH:
ls -td /opt/elasticbeanstalk/node-install/node-* | head -1
/bin - node -v (enjoy :)
dubeegee
Updated on June 16, 2022Comments
-
dubeegee almost 2 years
Amazon Beanstalk installs node and npm into really obscure places - and I'm not sure they won't change if EB decides to use a newer version of node, which would cause my application to break.
These are the locations for node and npm:
/opt/elasticbeanstalk/node-install/node-v0.8.24-linux-x64/bin/node /opt/elasticbeanstalk/node-install/node-v0.8.24-linux-x64/bin/npm
I'm worried about the
0.8.24
part changing and I'd rather not grep for things in cron or monit scripts when trying to find something that is normally just/usr/bin/XXX
.how do I get a consistent filepath for these executables? and why does EB do this?
for reference, I tried setting the
NodeVersion
option in an.ebextensions/app.config
, it had no effect on the install location. -
h-kippo almost 9 yearsThis script will fail next time when the app is deployed
-
asaf am almost 9 yearsThanks @h-kippo I updated it so it forcefully creates the symlink if it already exists (if this was the problem)
-
ariestav about 8 yearsThis does allow me to run npm and node from any path when I've ssh'ed into my eb instance, but for some reason the command will never "take" an argument. For example,
npm install
results in just listing all the possible options for npm. -
Eric almost 8 yearsTo clarify, this should go in a file like
.ebextensions/nodepath.config
, right? -
CherryDT over 7 yearsThat's because these are evaluated as shell scripts, not symlinks. Try
mode: "100755"
instead. -
pscl over 6 yearsThis seems more robust than the accepted answer in that it uses the node version setting rather than just picking the most recently installed version (or whatever arbitrary sort order)
-
spuder over 6 yearsStack overflow isn't rendering the back ticks, which are required, (see Peter Johnsons answer)
-
spuder over 6 yearsOr just use the
$NODE_HOME
environment variable as suggested in dorianm's answer -
mpyw almost 6 years
command: 'env PATH="$PATH:$NODE_HOME/bin" sh -c 'npm run build'
works fine. thanks -
Pherrymason almost 6 yearsThis does not look like it works for me, as NODE_HOME seems to not be set :(
-
GoGoris over 5 yearsAccording to the latest docs you have to start with "120xxx" to create a symlink: docs.aws.amazon.com/elasticbeanstalk/latest/dg/…
-
Adiii over 5 yearssudo ln -sf
ls -td /opt/elasticbeanstalk/node-install/node-* | head -1
/bin/node /bin/node