134

私は新しい 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"

ビルドしようとしたときの出力は次のとおりです。

docker build -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 を作成するための基本的な何かが欠けている可能性がありますが、これまでに行ったすべての読書では、良い解決策が示されていません。

4

17 に答える 17

146

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
于 2015-02-08T05:17:33.847 に答える
38

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


ドッカーファイル:

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"]
于 2016-01-04T13:09:09.980 に答える
21

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
于 2014-09-17T20:56:25.327 に答える
11

これが私の作業バージョンです

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 の回答に助けられました。

于 2015-11-27T19:12:19.777 に答える
10

@Kuhessの回答の提案に基づいて、ソースコマンドをDockerfileの次のコマンドに置き換えました

RUN cat ~/.nvm/nvm.sh >> installnode.sh
RUN echo "nvm install 0.10.35" >> installnode.sh
RUN sh installnode.sh
于 2015-02-08T01:25:05.700 に答える
8

問題の nvm コマンドを取得しようとする試みとの主な違い:

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

これは機能せず、受け入れられた回答で同じことを試みます:

source $NVM_DIR/nvm.sh

2 番目のバージョンは nvm.sh スクリプトを直接ソースとしているのに対し、元のバージョンは .bashrc ファイルを介してそれを実行しようとしています。

.bashrc ファイルには、非対話型シェルで実行されている場合に終了する行があります。

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

そのため、実際にシェルに nvm コマンドを配置する nvm.sh をソースするところまで到達することはありません。

ドッカーが非対話型シェルでこのようなものを実行していても、私は驚かないでしょう。これは明示的に指摘されていなかったので、vagrant で似たようなことをしていたときに気になったので、言及しようと思いました。

于 2016-07-24T17:34:42.613 に答える
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。これを行わないと、一部のパッケージが docker 内にインストールされないことがわかりました。

于 2015-04-15T20:52:03.120 に答える
2

これは、イメージ "php:7.4.15" (debian:buster-slim) を拡張するときに nodejs の lts バージョンをインストールします。

# Install nvm to install npm and node.js
ENV NVM_DIR /root/.nvm
ENV NODE_VERSION lts/*
RUN mkdir $HOME/.nvm && \
    curl -o- https://raw.githubusercontent.com/nvm-sh/nvm/v0.37.2/install.sh | bash && \
    chmod +x $HOME/.nvm/nvm.sh && \
    . $HOME/.nvm/nvm.sh && \
    nvm install --latest-npm "$NODE_VERSION" && \
    nvm alias default "$NODE_VERSION" && \
    nvm use default && \
    DEFAULT_NODE_VERSION=$(nvm version default) && \
    ln -sf /root/.nvm/versions/node/$DEFAULT_NODE_VERSION/bin/node /usr/bin/nodejs && \
    ln -sf /root/.nvm/versions/node/$DEFAULT_NODE_VERSION/bin/node /usr/bin/node && \
    ln -sf /root/.nvm/versions/node/$DEFAULT_NODE_VERSION/bin/npm /usr/bin/npm
于 2021-03-07T20:51:05.977 に答える