새 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을 작성하는 데 필요한 기본 사항을 놓치고있을 수 있지만 지금까지 제가 읽은 모든 내용은 저에게 좋은 솔루션을 보여주지 못했습니다.
답변
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
답변
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"]
답변
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
하지 않지만-내 기본 이미지에 대해 이상 할 수 있습니다.
답변
RUN
Dockerfile의 각각 은 다른 컨테이너에서 실행됩니다. 따라서 컨테이너에서 파일을 소싱하면 해당 콘텐츠를 다음 파일에서 사용할 수 없습니다.
그렇기 때문에 응용 프로그램을 설치하고 여러 단계를 수행해야 할 때 동일한 컨테이너에서 수행해야합니다.
귀하의 예 :
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
답변
이것은 최고 답변을 기반으로하며 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
참고 nvm
bash는 명령하지 않습니다, 그것은 별칭입니다. 에 의존한다면 이것은 당신을 망칠 수 있습니다 $PATH
.
답변
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
,CMD
및ENTRYPOINT
이 현재 사용자 (일반적으로 루트) 하에서 실행되고 쉘 형식으로 실행되는 경우 ~ / .bashrc 파일을 소싱 함을 의미합니다 . -
두 번째 줄
nvm
은 bash로 설치 됩니다. bash로 스크립트를 실행하면 ~ / .bashrc 파일에 추가 됩니다. -
세 번째 줄은 특정 버전의 nodejs를 설치하고 사용합니다.
nvm
,npm
그리고node
그들이 배쉬 로그인 쉘 (라인 1 참조)를 통해 실행되기 때문에 명령을 사용할 수 있습니다.
답변
@Kuhess 답변의 제안에 따라 Dockerfile에서 소스 명령을 다음으로 대체했습니다.
RUN cat ~/.nvm/nvm.sh >> installnode.sh
RUN echo "nvm install 0.10.35" >> installnode.sh
RUN sh installnode.sh