Install the latest versions of Node.js and npm, into a Docker container, with or without the need for root access. Easily update both applications to the latest versions.
Ubuntu and Node
Recently, I was setting up a new development laptop with Ubuntu 14.10 (Utopic Unicorn). As part of the setup, I needed to install all the several development tools, including Node.js and npm. Researching the current recommendations for installing Node.js and npm on Ubuntu, I found using the traditional ‘apt-get‘ command does not always install the latest versions of either application. Additionally, ‘apt-get’ makes updating those versions difficult.
After a lot of investigation, I created three different snippets of code to install the latest copies of Node.js and npm. Some of my code came from Isaac Z. Schlueter‘s series of installations Gists, and a post on StackOverflow by Pascal Hartig. Joyant and others recommended Isaac’s Gists for installing earlier versions of Node.js and npm. Other code was found in posts by DigitalOcean. Versions are as follows:
- Version 1: using ‘apt-get install’
- Version 2: using curl, make, and npmjs.org’s install script
- Version 3: version 2 without requiring ‘sudo’ to use npm*
*There is some debate on the use of ‘sudo’ with some earlier versions of npm. It appears not to be recommended with the latest versions of npm.
Docker
Docker containers and virtual machines (VM) are ideal platforms for developing and testing applications, locally. I often create a Docker container or VirtualBox VM, to install and test new scripts, before running them within our software environments. To test this code, I created three separate Docker containers, based on the official 14.04 Ubuntu base image, located on Docker Hub. I then executed each version of code within a container. After installation testing, I chose version 2 for my laptop.
GitHub Gists
The three versions of install scripts on gist.github.com, perform the following tasks:
- Creates Docker container
- Updates Ubuntu system packages within container
- Creates new ‘testuser’ account within container (‘testuser’)
- Installs required software to install Node.js, if necessary (curl, make, etc.)
- Installs Node.js and npm
- Installs some common full-stack JavaScript npm packages
- Verifies installation locations and contents correct
############################################################################### | |
# Version 1: using ‘apt-get install’ | |
# Installs using apt-get | |
# Requires update to npm afterwards | |
# Harder to get latest copy of node | |
# Requires sudo to use npm | |
############################################################################### | |
# create new docker ubuntu container | |
sudo docker run -i -t ubuntu /bin/bash # drops you into container as root | |
# update and install all required packages (no sudo required as root) | |
# https://gist.github.com/isaacs/579814#file-only-git-all-the-way-sh | |
apt-get update -yq && apt-get upgrade -yq && \ | |
apt-get install -yq curl git nano | |
# install from nodesource using apt-get | |
# https://www.digitalocean.com/community/tutorials/how-to-install-node-js-on-an-ubuntu-14-04-server | |
curl -sL https://deb.nodesource.com/setup | sudo bash - && \ | |
apt-get install -yq nodejs build-essential | |
# fix npm - not the latest version installed by apt-get | |
npm install -g npm | |
# add user with sudo privileges within Docker container | |
# without adduser input questions | |
# http://askubuntu.com/questions/94060/run-adduser-non-interactively/94067#94067 | |
USER="testuser" && \ | |
adduser --disabled-password --gecos "" $USER && \ | |
sudo usermod -a -G sudo $USER && \ | |
echo "$USER:abc123" | chpasswd && \ | |
su - $USER # switch to testuser | |
# install common full-stack JavaScript packages globally | |
# http://blog.nodejs.org/2011/03/23/npm-1-0-global-vs-local-installation | |
sudo npm install -g yo grunt-cli bower express | |
# optional, check locations and packages are correct | |
which node; node -v; which npm; npm -v; \ | |
npm ls -g --depth=0 |
############################################################################### | |
# Version 2: using curl, make, and npmjs.org’s install script | |
# Installs using make and shell script | |
# Easier to update node and npm versions in future | |
# Requires sudo to use npm | |
############################################################################### | |
# create new docker ubuntu container | |
sudo docker run -i -t ubuntu /bin/bash # drops you into container as root | |
# update and install all required packages (no sudo required as root) | |
# https://gist.github.com/isaacs/579814#file-only-git-all-the-way-sh | |
apt-get update -yq && apt-get upgrade -yq && \ | |
apt-get install -yq g++ libssl-dev apache2-utils curl git python make nano | |
# install latest Node.js and npm | |
# https://gist.github.com/isaacs/579814#file-node-and-npm-in-30-seconds-sh | |
mkdir ~/node-latest-install && cd $_ && \ | |
curl http://nodejs.org/dist/node-latest.tar.gz | tar xz --strip-components=1 && \ | |
make install && \ # takes a few minutes to build... | |
curl https://www.npmjs.org/install.sh | sh | |
# add user with sudo privileges within Docker container | |
# without adduser input questions | |
# http://askubuntu.com/questions/94060/run-adduser-non-interactively/94067#94067 | |
USER="testuser" && \ | |
adduser --disabled-password --gecos "" $USER && \ | |
sudo usermod -a -G sudo $USER && \ | |
echo "$USER:abc123" | chpasswd && \ | |
su - $USER # switch to testuser | |
# install common full-stack JavaScript packages globally | |
# http://blog.nodejs.org/2011/03/23/npm-1-0-global-vs-local-installation | |
sudo npm install -g yo grunt-cli bower express | |
# optional, check locations and packages are correct | |
which node; node -v; which npm; npm -v; \ | |
npm ls -g --depth=0 |
############################################################################### | |
# Version 3: version 2 without requiring ‘sudo’ to use npm | |
# Does NOT require sudo to use npm | |
############################################################################### | |
# create new docker ubuntu container | |
sudo docker run -i -t ubuntu /bin/bash # drops you into container as root | |
# update and install all required packages (no sudo required as root) | |
# https://gist.github.com/isaacs/579814#file-only-git-all-the-way-sh | |
apt-get update -yq && apt-get upgrade -yq && \ | |
apt-get install -yq g++ libssl-dev apache2-utils curl git python make nano | |
# add user with sudo privileges within Docker container | |
# without adduser input questions | |
# http://askubuntu.com/questions/94060/run-adduser-non-interactively/94067#94067 | |
USER="testuser" && \ | |
adduser --disabled-password --gecos "" $USER && \ | |
sudo usermod -a -G sudo $USER && \ | |
echo "$USER:abc123" | chpasswd && \ | |
su - $USER # switch to testuser | |
# setting up npm for global installation without sudo | |
# http://stackoverflow.com/a/19379795/580268 | |
MODULES="local" && \ | |
echo prefix = ~/$MODULES >> ~/.npmrc && \ | |
echo "export PATH=\$HOME/$MODULES/bin:\$PATH" >> ~/.bashrc && \ | |
. ~/.bashrc && \ | |
mkdir ~/$MODULES | |
# install Node.js and npm | |
# https://gist.github.com/isaacs/579814#file-node-and-npm-in-30-seconds-sh | |
mkdir ~/node-latest-install && cd $_ && \ | |
curl http://nodejs.org/dist/node-latest.tar.gz | tar xz --strip-components=1 && \ | |
./configure --prefix=~/$MODULES && \ | |
make install && \ # takes a few minutes to build... | |
curl https://www.npmjs.org/install.sh | sh | |
# install common fullstack JavaScript packages globally | |
npm install -g yo grunt-cli bower express | |
# optional, check locations and packages are correct | |
which node; node -v; which npm; npm -v; \ | |
npm ls -g --depth=0 |
Running Code
Share this:
- Click to share on Twitter (Opens in new window)
- Click to share on LinkedIn (Opens in new window)
- Click to share on Facebook (Opens in new window)
- Click to share on Reddit (Opens in new window)
- Click to share on Tumblr (Opens in new window)
- Click to email a link to a friend (Opens in new window)
- Click to print (Opens in new window)
14.10, container, docker, Git, JavaScript, Node, Node.js, npm, package, sudo, Ubuntu, utopic unicorn
This entry was posted on November 17, 2014, 10:51 pm and is filed under Bash Scripting, Build Automation, Client-Side Development, DevOps, Enterprise Software Development. You can follow any responses to this entry through RSS 2.0. You can leave a response, or trackback from your own site.
#1 by krish on December 18, 2017 - 7:27 pm
RUN curl https://www.npmjs.org/install.sh \
&& sh install.sh
npm install typescript –global
i am trying in this way in the file…
i am getting can’t open install.sh file…
is there anything wromg in the file