'How to refresh your shell when using a Dockerfile?

I am trying to build a Dockerfile that can make use of Azure functions. After unsuccessfully trying to build it using alpine:3.9 because of library issues, I swapped to ubuntu:18.04. Now I have a problem in that I can't install nvm (node version manager) in such a way that I can install node. My Dockerfile is below. I have managed to install nvm but now, while trying to use nvm, I cannot install the node version I want. The problem probably has to do with refreshing the shell but that is tricky to do as it appears that Docker continues to use the original shell it entered to run the next build stages. Any suggestions on how to refresh the shell so nvm can work effectively?

FROM ubuntu:18.04

RUN apt update && apt upgrade -y && apt install -qq -y --no-install-recommends \
    python-pip \
    python-setuptools \
    wget \
    build-essential \
    libssl-dev

RUN pip install azure-cli

RUN wget -qO- https://raw.githubusercontent.com/creationix/nvm/v0.33.0/install.sh | bash 

RUN . /root/.nvm/nvm.sh && nvm install 10.14.1 && node

ENTRYPOINT ["/bin/bash"]


Solution 1:[1]

You usually don't need version managers like nvm in a Docker image. Since a Docker image packages only a single application, and since it has its own isolated filesystem, you can just install the single version of Node you need.

The first thing I'd try is to just install whatever version of Node the standard Ubuntu package has (in Ubuntu 18.04, looks like 8.11). While there are some changes between Node versions, for the most part the language and core library have been pretty stable.

RUN apt update && apt-install nodejs

Or, if you need something newer, there are official Debian packages:

RUN curl -sSL https://deb.nodesource.com/gpgkey/nodesource.gpg.key | apt-key add - \
 && echo "deb https://deb.nodesource.com/node_10.x cosmic main" > /etc/apt/sources.list.d/nodesource.list \
 && apt update \
 && apt install nodejs

This will give you a current version of that major version of Node (as of this writing, 10.15.1).

If you really need that specific version of Node, there are official binary packages. I might write:

FROM ubuntu:18.04
ARG node_version=10.14.1
RUN apt-get update \
 && DEBIAN_FRONTEND=noninteractive \
    apt-get install --no-install-recommends --assume-yes \
      ca-certificates \
      curl \
      xz-utils
RUN cd /usr/local \
 && curl -o- https://nodejs.org/dist/v${node_version}/node-v${node_version}-linux-x64.tar.xz \
  | tar xJf - --strip 1

...where the last couple of lines unpack the Node tarball directly into /usr/local.

Solution 2:[2]

After install nvm command put:

SHELL ["/bin/bash", "--login" , "-c"]
RUN nvm install 17
SHELL ["/bin/sh", "-c"]

Default shell is sh and first command switches it to bash. Parameter --login is required as you want to source .bashrc.

As all subsequent commands would be executed with changed shell it's good to switch it back to sh if you don't need it anymore.

Sources

This article follows the attribution requirements of Stack Overflow and is licensed under CC BY-SA 3.0.

Source: Stack Overflow

Solution Source
Solution 1 David Maze
Solution 2 Andrzej Polis