Docker에 nvm을 설치하는 방법은 무엇입니까?


101

새 Docker 이미지를 빌드하는 중이며 nodejs를 관리 할 수 ​​있도록 NVM을 설치하려고합니다.

NVM 설치 방법에 대한 문서를 읽으면 NVM 사용을 시작하려면 .bashrc 파일을 소싱해야한다고 언급합니다.

Dockerfile에서 이것을 설정하려고 시도했지만 지금까지 오류로 인해 빌드가 실패합니다.

"bash : nvm : 명령을 찾을 수 없음"

내 Dockerfile의 관련 줄은 다음과 같습니다.

ADD files/nvm_install.sh /root/
RUN chmod a+x  /root/nvm_install.sh
RUN bash -c "/root/nvm_install.sh"
RUN bash -l -c "source /root/.bashrc"
RUN cd /root
RUN bash -l -c "nvm install 0.10.31"

다음은 빌드를 시도한 결과입니다.

도커 빌드 -t nginx_dock.

Step 0 : FROM ubuntu
---> 826544226fdc
Step 1 : MAINTAINER dficociello
---> Using cache
---> da3bc340fbb3
Step 2 : RUN apt-get update
---> Using cache
---> 6b6b611feb4f
Step 3 : RUN apt-get install nginx curl -y
---> Using cache
---> 159eb0b16d23
Step 4 : RUN touch /root/.bashrc
---> Using cache
---> 5e9e8216191b
Step 5 : ADD files/nginx.conf /etc/nginx/
---> Using cache
---> c4a4a11296a2
Step 6 : ADD files/nvm_install.sh /root/
---> Using cache
---> b37cba2a18ca
Step 7 : RUN chmod a+x  /root/nvm_install.sh
---> Using cache
---> bb13e2a2893d
Step 8 : RUN bash -c "/root/nvm_install.sh"
---> Using cache
---> 149b49a8fc71
Step 9 : RUN bash -l -c "source /root/.bashrc"
---> Running in 75f353ed0d53
---> 0eae8eae7874
Removing intermediate container 75f353ed0d53
Step 10 : RUN cd /root
---> Running in feacbd998dd0
---> 284293ef46b0
Removing intermediate container feacbd998dd0
Step 11 : RUN bash -l -c "nvm install 0.10.31"
---> Running in 388514d11067
bash: nvm: command not found
2014/09/17 13:15:11 The command [/bin/sh -c bash -l -c "nvm install 0.10.31"] returned a non-zero         code: 127

저는 Docker를 처음 접했기 때문에 Dockerfile을 작성하는 데 필요한 기본 사항을 놓치고있을 수 있지만 지금까지 제가 읽은 모든 내용은 저에게 좋은 솔루션을 보여주지 못했습니다.


11
아니,이 같은 중복은 고정 표시기 내부에 설치하기 고집이 아닌 표준 설치
데이비드 Ficociello

단일 버전의 노드 만 설치하기 때문에 nvm을 설치할 필요가 없어 보입니다. Docker 노드 저장소 에서 제공하는 Dockerfile은 노드 설치 방법에 대한 참조로 사용할 수 있습니다.
mikwat

답변:


121

RUN bash...별도의 프로세스에서 실행할 때 마다 환경에 설정된 모든 항목이 유지되지 않습니다. 설치 방법은 다음과 같습니다 nvm.

# Replace shell with bash so we can source files
RUN rm /bin/sh && ln -s /bin/bash /bin/sh

# Set debconf to run non-interactively
RUN echo 'debconf debconf/frontend select Noninteractive' | debconf-set-selections

# Install base dependencies
RUN apt-get update && apt-get install -y -q --no-install-recommends \
        apt-transport-https \
        build-essential \
        ca-certificates \
        curl \
        git \
        libssl-dev \
        wget \
    && rm -rf /var/lib/apt/lists/*

ENV NVM_DIR /usr/local/nvm # or ~/.nvm , depending
ENV NODE_VERSION 0.10.33

# Install nvm with node and npm
RUN curl https://raw.githubusercontent.com/creationix/nvm/v0.20.0/install.sh | bash \
    && . $NVM_DIR/nvm.sh \
    && nvm install $NODE_VERSION \
    && nvm alias default $NODE_VERSION \
    && nvm use default

ENV NODE_PATH $NVM_DIR/v$NODE_VERSION/lib/node_modules
ENV PATH      $NVM_DIR/v$NODE_VERSION/bin:$PATH

속도에 최대 두 번 만 변경에 v0.20.0v0.24.1
itsnikolay

8
NVM와 0.31.0노드 v4.2.3의 경로입니다/usr/local/nvm/versions/node/v4.2.3/bin
cwhsu

4
@thiagoh 이것은 질문자의 nvm 설치가 작동하지 않고 작동하는 답변이 작동하는 이유를 설명하지 않습니다. 별도의 프로세스에서 실행되는 쉘과는 관련이 없습니다. 질문은 nvm 명령을 bash에로드하는 nvm.sh 파일을로드하기 위해 bash.rc를 소싱하려고 시도하지만 bash.rc가 대화식으로 실행되지 않으면 일찍 종료되므로 nvm 명령이로드되지 않기 때문입니다. 모든 성공적인 답변은 bash.rc를 통해 수행하는 대신 직접 nvm.sh 소스입니다. 이것이이 일을 만드는 열쇠입니다.
tobuslieven

2
sh를 bash로 바꾸는 대신 . $NVM_DIR/nvm.sh소스 바이너리를 피하면서 간단히 할 수 있습니다 .
Razvan Grigore

3
이것은 가깝지만 경로를 약간 조정해야합니다. ENV NODE_PATH $ NVM_DIR / versions / node / v $ NODE_VERSION / lib / node_modules ENV PATH $ NVM_DIR / versions / node / v $ NODE_VERSION / bin : $ PATH
Lunulata

31

Ubuntu (마지막 버전)에 NVM과 함께 Node.js를 설치하는 방법을 찾는 모든 사람을 돕기 위해 아래에 dockerfile을 만들었습니다. Docker, Ubuntu, Node.js의 마지막 버전을 사용하고 있으며 NVM이 제대로 작동합니다 ($ PATH가 수정 됨). 프로덕션 환경에서 사용하고 있습니다.

$ docker info \
Server Version: 1.9.1
Kernel Version: 4.1.13-boot2docker
Operating System: Boot2Docker 1.9.1 (TCL 6.4.1); master : cef800b - Fri Nov 20 19:33:59 UTC 2015

Node.js Version: stable 4.2.4 LTS
Ubuntu Version: 14.04.3


dockerfile :

FROM ubuntu:14.04.3

# Replace shell with bash so we can source files
RUN rm /bin/sh && ln -s /bin/bash /bin/sh

# make sure apt is up to date
RUN apt-get update --fix-missing
RUN apt-get install -y curl
RUN apt-get install -y build-essential libssl-dev

ENV NVM_DIR /usr/local/nvm
ENV NODE_VERSION 4.2.4

# Install nvm with node and npm
RUN curl https://raw.githubusercontent.com/creationix/nvm/v0.30.1/install.sh | bash \
    && source $NVM_DIR/nvm.sh \
    && nvm install $NODE_VERSION \
    && nvm alias default $NODE_VERSION \
    && nvm use default

ENV NODE_PATH $NVM_DIR/v$NODE_VERSION/lib/node_modules
ENV PATH      $NVM_DIR/versions/node/v$NODE_VERSION/bin:$PATH

RUN mkdir /usr/app
RUN mkdir /usr/app/log

WORKDIR /usr/app

# log dir
VOLUME /usr/app/log

# Bundle app source
COPY . /usr/app
# Install app dependencies
RUN npm install

EXPOSE  3000
CMD ["node", "server.js"]

1
NODE_PATH가 ENV가 아니어야합니다. NODE_PATH $ NVM_DIR / versions / node / v $ NODE_VERSION / lib / node_modules
Sentient

안녕하세요 @Sentient! 프로덕션 환경 (ubuntu) 및 로컬 개발 (OSX)에서이 도커를 실행하고 있으며 둘 다 오류없이 제대로 작동합니다. 오래된 NVM을 실행하고 있습니까?
danilodeveloper 2016

build-essential 및 libssl-dev를 설치하는 SUDO를 사용해야하는 이유가 있습니까? 저는 노련한 DevOps가 아닙니다.
a.barbieri

1
핵심은source $NVM_DIR/nvm.sh && nvm install $NODE_VERSION
Vladimir Kornea 19. 9.

24

Nvm 경로는 수락 된 답변 이후로 변경되었으므로 최신 nvm 버전을 사용하려면 몇 가지 사항을 변경해야합니다. 또한 sh작동 하도록 다시 매핑 할 필요가 없습니다 .

ENV NVM_DIR /usr/local/nvm
RUN curl -o- https://raw.githubusercontent.com/creationix/nvm/v0.33.1/install.sh | bash
ENV NODE_VERSION v7.9.0
RUN /bin/bash -c "source $NVM_DIR/nvm.sh && nvm install $NODE_VERSION && nvm use --delete-prefix $NODE_VERSION"

ENV NODE_PATH $NVM_DIR/versions/node/$NODE_VERSION/lib/node_modules
ENV PATH      $NVM_DIR/versions/node/$NODE_VERSION/bin:$PATH

에 대한 --delete-prefix옵션 이 필요한지 확실 nvm use하지 않지만-내 기본 이미지에 대해 이상 할 수 있습니다.


1
생명의 은인! 3 시간 전에 당신의 응답을 봤다면.
아드리안 Marinica

나를 위해 일한, 기본 이미지 PHP : 7.1.1
토비 멜러

18

RUNDockerfile의 각각 은 다른 컨테이너에서 실행됩니다. 따라서 컨테이너에서 파일을 소싱하면 해당 콘텐츠를 다음 파일에서 사용할 수 없습니다.

그렇기 때문에 응용 프로그램을 설치하고 여러 단계를 수행해야 할 때 동일한 컨테이너에서 수행해야합니다.

귀하의 예 :

ADD files/nvm_install.sh /root/
RUN chmod a+x /root/nvm_install.sh && \
  /root/nvm_install.sh && \
  source /root/.bashrc && \
  cd /root && \
  nvm install 0.10.31

좋아요, 설명 해주셔서 감사합니다. 그래서 스크립트를 다음과 같이 수정했습니다 :`FROM ubuntu MAINTAINER dficociello ADD files / nvm_install.sh / root / # Install nvm RUN [ "/ bin / bash", "-c", "rm -f / etc / nginx / nginx.conf && touch /root/.bashrc && apt-get update && apt-get install nginx curl -y && chmod a + x /root/nvm_install.sh && source /root/.bashrc && / root / nvm_install. sh && nvm install 0.10.31 "] ADD files / nginx.conf / etc / nginx / EXPOSE 22`다음 오류가 발생합니다.`/ bin / bash : /root/nvm_install.sh : / bin / bash : 잘못된 인터프리터 : 텍스트 파일 바쁜 '
데이비드 Ficociello

이 오류는 귀하의 회선에 연결되어야합니다 RUN ["/bin/bash", ...]. 로 둘러싸여서는 안되며 [...]인터프리터를 지정할 필요가 없습니다 /bin/bash -c.
Kuhess 2014 년

17

이것은 최고 답변을 기반으로하며 2018 년에 작동합니다.

# Replace shell with bash so we can source files
RUN rm /bin/sh && ln -s /bin/bash /bin/sh

# Install base dependencies
RUN apt-get update && apt-get install -y -q --no-install-recommends \
        apt-transport-https \
        build-essential \
        ca-certificates \
        curl \
        git \
        libssl-dev \
        wget

ENV NVM_DIR /usr/local/nvm
ENV NODE_VERSION 8.11.3

WORKDIR $NVM_DIR

RUN curl https://raw.githubusercontent.com/creationix/nvm/master/install.sh | bash \
    && . $NVM_DIR/nvm.sh \
    && nvm install $NODE_VERSION \
    && nvm alias default $NODE_VERSION \
    && nvm use default

ENV NODE_PATH $NVM_DIR/versions/node/v$NODE_VERSION/lib/node_modules
ENV PATH      $NVM_DIR/versions/node/v$NODE_VERSION/bin:$PATH

참고 nvmbash는 명령하지 않습니다, 그것은 별칭입니다. 에 의존한다면 이것은 당신을 망칠 수 있습니다 $PATH.


15

2020 년 2 월 20 일 업데이트 :이 솔루션은 debian기본 이미지를 사용하는 경우 작동합니다 . 사용하는 경우이 답변을ubuntu 참조하십시오 .

nvm내가 찾은 가장 깨끗한 설치 방법은 다음과 같습니다 .

SHELL ["/bin/bash", "--login", "-c"]

RUN curl -o- https://raw.githubusercontent.com/nvm-sh/nvm/v0.35.3/install.sh | bash
RUN nvm install 10.15.3

설명

  • 첫 번째 줄은 Dockerfile의 기본 셸을 bash 로그인 셸로 설정 합니다. 참고 : 이는 모든 후속 RUN, CMDENTRYPOINT이 현재 사용자 (일반적으로 루트) 하에서 실행되고 쉘 형식으로 실행되는 경우 ~ / .bashrc 파일을 소싱 함을 의미합니다 .

  • 두 번째 줄 nvm은 bash로 설치 됩니다. bash로 스크립트를 실행하면 ~ / .bashrc 파일에 추가 됩니다.

  • 세 번째 줄은 특정 버전의 nodejs를 설치하고 사용합니다. nvm, npm그리고 node그들이 배쉬 로그인 쉘 (라인 1 참조)를 통해 실행되기 때문에 명령을 사용할 수 있습니다.


1
정말 고맙습니다 !
Gaui

이것이 당신을 위해 일하고 있다는 것이 흥미 롭습니다. 비슷한 것을 시도했는데 빌드 중에 모든 것이 잘 보였지만 결과 이미지를 실행하려고했을 때 NPM을 찾을 수 없었습니다. 명시 적으로 설정 NVM_DIR(다른 여러 답변에 표시된 것처럼)이 해결되었습니다.
이메일 보내기

1
@esmail은 첫 번째 RUN명령 NVM_DIR~/.bashrc.
Dominic Roy-Stang

1
@ DominicRoy-Stang, 유효한 포인트. 내가 사용하는 이미지 sh.bashrc. 또한 명령 .bashrc을 실행하기 전에 실제로 소스를 얻었 RUN습니까? 공식 bash이미지로 간단한 테스트를 해보니 그렇지 않은 것 같았습니다.
이메일 보내기

1
@esmail은 첫 번째 줄 ( SHELL지시문)이 다루는 내용입니다. 연속 RUN 명령이 .bashrc파일을 제공 하는 로그인 쉘을 사용하게 합니다. 참고 : 명령이 쉘 모드에서 실행되는 경우에만 작동합니다. RUN nvm --version. 예를 들어 exec 모드에서 명령을 실행하면 작동하지 않습니다. RUN ["nvm", "--version"]. 나는 이것을 더 분명하게 만들기 위해 쉘 양식에 대해 제공하는 링크를 업데이트했습니다.
Dominic Roy-Stang

10

@Kuhess 답변의 제안에 따라 Dockerfile에서 소스 명령을 다음으로 대체했습니다.

RUN cat ~/.nvm/nvm.sh >> installnode.sh
RUN echo "nvm install 0.10.35" >> installnode.sh
RUN sh installnode.sh

8

여기 내 작업 버전이 있습니다.

FROM ubuntu:14.04

# Declare constants
ENV NVM_VERSION v0.29.0
ENV NODE_VERSION v5.0.0

# Replace shell with bash so we can source files
RUN rm /bin/sh && ln -s /bin/bash /bin/sh

# Install pre-reqs
RUN apt-get update
RUN apt-get -y install curl build-essential

# Install NVM
RUN curl -o- https://raw.githubusercontent.com/creationix/nvm/${NVM_VERSION}/install.sh | bash

# Install NODE
RUN source ~/.nvm/nvm.sh; \
    nvm install $NODE_VERSION; \
    nvm use --delete-prefix $NODE_VERSION;

@abdulljibali 및 @shamisis 답변의 도움을 받았습니다.


~/.nvm/nvm.sh파일을 소싱하는 것이 제가 필요한 열쇠였습니다.
Stephane 2016

이것은 우분투 16.04.2 컨테이너로 나를 위해 일한 유일한 솔루션이었습니다.
drohm

7

나는 nvm내부 의 실제 사례를 얻기 위해 전체를 검색했다는 사실부터 시작해야합니다.docker 아무것도 찾지 못했다 . 이 스레드의 답변조차도 작동하지 않았습니다.

그래서 나는 꽤 많은 시간을 보냈고 작동하는 것을 생각해 냈습니다.

# install dependencies
RUN apt-get update && apt-get install -y \
      curl \
      npm \
      nodejs \
      git;

# compatibility fix for node on ubuntu
RUN ln -s /usr/bin/nodejs /usr/bin/node;

# install nvm
RUN curl https://raw.githubusercontent.com/creationix/nvm/v0.24.1/install.sh | sh;

# invoke nvm to install node
RUN cp -f ~/.nvm/nvm.sh ~/.nvm/nvm-tmp.sh; \
    echo "nvm install 0.12.2; nvm alias default 0.12.2" >> ~/.nvm/nvm-tmp.sh; \
    sh ~/.nvm/nvm-tmp.sh; \
    rm ~/.nvm/nvm-tmp.sh;

nodejs통해 어떻게 설치했는지 확인하십시오 apt-get. 이것이 완료되지 않으면 일부 패키지가 도커 내부에 설치되지 않는다는 것을 발견했습니다.


yup-man-약 100 개의 솔루션을 시도했지만 귀하의 솔루션 만-10x!
srfrnk

노드 버전이 ~ / .nvm 디렉토리 내에 제대로 설치되어 ~ / .nvm / nvm-tmp.sh, 그래서 사용하는 것이 올바른
guidoman

6

질문에서 nvm 명령을 얻으려는 시도의 주요 차이점 :

RUN bash -l -c "source /root/.bashrc"

작동하지 않고 수락 된 답변에서 똑같이 시도하십시오.

source $NVM_DIR/nvm.sh

두 번째 버전은 nvm.sh 스크립트를 직접 소싱하는 반면 원본은 .bashrc 파일을 통해 수행하려고합니다.

.bashrc 파일에는 비대화 형 셸에서 실행중인 경우 종료되는 초기 줄이 있습니다.

# If not running interactively, don't do anything
case $- in
    *i*) ;;
    *) return;;
esac

따라서 실제로 nvm 명령을 쉘에 넣는 nvm.sh를 소싱 한 위치에 도달하지 않습니다.

도 커가 비대화 형 셸에서이 항목을 실행하는 경우 놀라지 않을 것입니다. 이것은 명시 적으로 지적되지 않았기 때문에 방랑자와 비슷한 일을 할 때 나를 잡았 기 때문에 언급 할 것이라고 생각했습니다.


문제의 원인을 찾아 주셔서 감사합니다. 기본 우분투 19.10 이미지에서 /etc/skel/.bashrc 파일을 복사 한 다음 위의 문제가되는 줄을 주석 처리했습니다. 그런 다음 Dockerfile에서 COPY 명령을 사용하여 "수정 된"/etc/skel/.bashrc를 / etc / skel에 복사 한 다음 RUN을 사용하여 / bin / bash를 셸로 사용하는 사용자를 만듭니다. 그런 다음 RUN [ "/ bin / bash", "-c", "-l", YOUR_COMMAND [S] _HERE]에 대한 후속 호출이 제대로 작동했습니다.
Stephan Doliov

6

가장 깨끗한 방법을 찾는 데 한두 시간이 걸렸습니다. --login이 .bashrc를 실행하지 않는 것 같으므로 대화 형 모드에서 실행하려면 -i를 제공해야합니다. 이로 인해 Docker가 잠시 소리를 지르므로 설치를 위해이 방법으로 만 시작한 다음 표준 셸로 재설정합니다.

# Installing Node
SHELL ["/bin/bash", "--login", "-i", "-c"]
RUN curl -o- https://raw.githubusercontent.com/nvm-sh/nvm/v0.35.2/install.sh | bash
RUN source /root/.bashrc && nvm install 12.14.1
SHELL ["/bin/bash", "--login", "-c"]

귀하의 답변은 내 ubuntu이미지가 기본 이미지로 사용되지 않는다는 것을 깨달았습니다 (하지만 귀하의 이미지는 작동합니다). 나는 debian기반 이미지를 사용하고 있었다 . 둘 사이의 불일치를 일으키는 원인이 무엇인지 잘 모르겠습니다. 어떤 아이디어?
Dominic Roy-Stang

우분투 19:10을 기본 이미지로 사용하고 있습니다. 저에게 적합한 것이 무엇인지 알 수 있도록 모든 관련 Docker 지침을 게시하겠습니다. 내가 빠뜨린 모든 지침은 관련이 없거나 제공 할 수 없습니다. 댓글로 표현하겠습니다. 문자 제한이 너무 낮게 설정되어 있으므로 다음 댓글에 게시하겠습니다
user2896438

4

이것들 중 어느 것도 나를 위해 일하지 않았습니다. python3-onbuild컨테이너의 경우 nvm 설치에 대한 기호 링크를 강제로 만들어야했습니다.

# Install npm and nodejs
RUN apt-get install -y build-essential libssl-dev

RUN mkdir /root/.nvm
ENV NVM_DIR /root/.nvm
ENV NODE_VERSION 8.9.4

RUN curl -o- https://raw.githubusercontent.com/creationix/nvm/v0.33.9/install.sh | bash
RUN chmod +x $HOME/.nvm/nvm.sh
RUN . $HOME/.nvm/nvm.sh && nvm install $NODE_VERSION && nvm alias default $NODE_VERSION && nvm use default && npm install -g npm

RUN ln -sf /root/.nvm/versions/node/v$NODE_VERSION/bin/node /usr/bin/nodejs
RUN ln -sf /root/.nvm/versions/node/v$NODE_VERSION/bin/node /usr/bin/node
RUN ln -sf /root/.nvm/versions/node/v$NODE_VERSION/bin/npm /usr/bin/npm

동의합니다. 도커 컨테이너 (Debian GNU / Linux 9 (stretch))에 설치할 때 nvm도 $HOME/.nvm나에게 적합합니다.
Dave Stevens

예, 나에게도 추가하려면 심볼릭 링크가 필요했습니다. 나는 다른 사람들이 그것을 어떻게 필요로하지 않았는지 궁금합니다.
PEZO

0

이것은 나를 위해 일한 것입니다 (데비안 버스터를 사용하고 있습니다).

RUN apt-get update
RUN apt-get install -y build-essential checkinstall libssl-dev
RUN curl -o- https://raw.githubusercontent.com/creationix/nvm/v0.35.1/install.sh | bash
SHELL ["/bin/bash", "--login", "-c"]

이제 할 수 있습니다 nvm install <version>.


0

단 하나의 대답으로 컬 설치가 이루어 지지만 전체 Dockerfile이 작동하지 않습니다.

여기 에 Ubuntu 18.04.3 LTS로 최신 nvm 2020 버전 을 설치하는 Dockerfile을 복사 / 붙여 넣기 할 준비가되었습니다.

FROM ubuntu

RUN apt-get update
RUN echo "y" | apt-get install curl
ENV NVM_DIR /usr/local/nvm
RUN mkdir -p /usr/local/nvm
RUN curl -o- https://raw.githubusercontent.com/nvm-sh/nvm/v0.35.3/install.sh | bash
ENV NODE_VERSION v10
RUN /bin/bash -c "source $NVM_DIR/nvm.sh && nvm install $NODE_VERSION && nvm use --delete-prefix $NODE_VERSION"

ENV NODE_PATH $NVM_DIR/versions/node/$NODE_VERSION/lib/node_modules
ENV PATH      $NVM_DIR/versions/node/$NODE_VERSION/bin:$PATH
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.