จะติดตั้ง nvm ใน Docker ได้อย่างไร?


109

ฉันอยู่ในขั้นตอนการสร้างอิมเมจ Docker ใหม่และฉันต้องการติดตั้ง NVM เพื่อที่ฉันจะได้จัดการ nodejs

การอ่านเอกสารเกี่ยวกับวิธีการติดตั้ง NVM ที่พวกเขาระบุว่าคุณต้องจัดหาไฟล์. bashrc ของคุณเพื่อเริ่มใช้ NVM

ฉันพยายามตั้งค่านี้ใน 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 ดังนั้นฉันอาจพลาดบางอย่างพื้นฐานในการเขียน Dockerfiles แต่จนถึงตอนนี้การอ่านทั้งหมดที่ฉันได้ทำไปยังไม่ได้แสดงวิธีแก้ปัญหาที่ดี


12
ไม่ซ้ำกันเนื่องจากเป็นการติดตั้งภายใน
Docker

1
เนื่องจากคุณติดตั้งโหนดเวอร์ชันเดียวเท่านั้นจึงไม่จำเป็นต้องติดตั้ง nvm Dockerfiles ที่จัดเตรียมโดยที่เก็บโหนด Docker สามารถใช้เป็นข้อมูลอ้างอิงสำหรับวิธีการติดตั้งโหนด
mikwat

คำตอบ:


124

เมื่อคุณ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.0เป็นv0.24.1
itsnikolay

8
ด้วย nvm 0.31.0และโหนดv4.2.3พา ธ คือ/usr/local/nvm/versions/node/v4.2.3/bin
cwhsu

4
@thiagoh สิ่งนี้ไม่ได้อธิบายว่าเหตุใดการติดตั้ง nvm ของผู้ถามจึงไม่ทำงานและคำตอบที่ใช้งานได้ผล ไม่มีอะไรเกี่ยวข้องกับเชลล์ที่ทำงานในกระบวนการแยกต่างหาก เป็นเพราะคำถามพยายามที่จะซอร์ส bash.rc เพื่อโหลดไฟล์ nvm.sh ซึ่งโหลดคำสั่ง nvm ลงใน bash แต่ bash.rc ออกก่อนเวลาที่เรียกใช้แบบไม่โต้ตอบดังนั้นคำสั่ง nvm จึงไม่ถูกโหลด คำตอบที่ประสบความสำเร็จทั้งหมดเป็นแหล่ง nvm.sh โดยตรงแทนที่จะทำผ่าน bash.rc. นี่คือกุญแจสำคัญที่ทำให้งานนี้
tobuslieven

2
แทนที่จะแทนที่ sh ด้วย bash คุณสามารถทำได้. $NVM_DIR/nvm.shโดยหลีกเลี่ยงซอร์สไบนารี
Razvan Grigore

3
สิ่งนี้ใกล้เคียง แต่เส้นทางต้องมีการปรับแต่งเล็กน้อยควรเป็น: ENV NODE_PATH $ NVM_DIR / เวอร์ชัน / โหนด / v $ NODE_VERSION / lib / node_modules ENV PATH $ NVM_DIR / เวอร์ชัน / โหนด / v $ NODE_VERSION / bin: $ PATH
Lunulata

33

เพื่อช่วยทุกคนที่กำลังมองหาวิธีติดตั้ง Node.js ด้วย NVM บน Ubuntu (เวอร์ชันล่าสุด) ฉันได้สร้าง 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 / เวอร์ชัน / โหนด / v $ NODE_VERSION / lib / node_modules
Sentient

สวัสดี @Sentient! ฉันกำลังเรียกใช้นักเทียบท่านี้ในสภาพแวดล้อมการใช้งานจริง (อูบุนตู) และ dev ภายใน (OSX) ทั้งสองทำงานได้อย่างถูกต้องโดยไม่มีข้อผิดพลาด คุณอาจใช้ NVM ที่ล้าสมัยหรือไม่?
danilodeveloper

มีเหตุผลไหมที่ฉันควรใช้ SUDO ติดตั้ง build-essential และ libssl-dev ฉันไม่ได้เป็น DevOps ที่ช่ำชองเลย
a.barbieri

1
ที่สำคัญคือsource $NVM_DIR/nvm.sh && nvm install $NODE_VERSION
Vladimir Kornea

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 ชั่วโมงก่อน
Adrian Marinica

ทำงานให้ฉันภาพพื้นฐาน php: 7.1.1
Toby Mellor

20

แต่ละไฟล์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

โอเคขอบคุณมากสำหรับคำอธิบาย ดังนั้นฉันจึงได้แก้ไขสคริปต์ของฉันให้มีลักษณะดังนี้: จาก 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 ติดตั้ง 0.10.31 "] เพิ่มไฟล์ / nginx.conf / etc / nginx / EXPOSE 22` ฉันได้รับข้อผิดพลาดต่อไปนี้: `/ bin / bash: /root/nvm_install.sh: / bin / bash: ล่ามที่ไม่ถูกต้อง: ไฟล์ข้อความไม่ว่าง `
David Ficociello

RUN ["/bin/bash", ...]ข้อผิดพลาดนี้ต้องเชื่อมโยงกับสายของคุณ มันจะต้องไม่ถูกล้อมรอบไปด้วยและคุณไม่จำเป็นต้องระบุล่าม[...] /bin/bash -c
Kuhess

19

อัปเดต 20/02/2020 : โซลูชันนี้ใช้ได้หากคุณใช้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 ไปยังเปลือกทุบตีเข้าสู่ระบบ หมายเหตุ: ที่นี้หมายถึงว่าทุกคนที่ตามมาRUN, CMDและENTRYPOINTจะทำงานภายใต้ผู้ใช้ปัจจุบัน (ปกติราก) และแหล่งที่มา~ / .bashrcหากไฟล์ทำงานในรูปแบบเปลือก

  • บรรทัดที่สองติดตั้งnvmด้วย bash เมื่อสคริปต์ทำงานกับทุบตีมันผนวกกับ~ / .bashrcไฟล์

  • บรรทัดที่สามติดตั้ง nodejs เวอร์ชันเฉพาะและใช้งาน nvm, npmและnodeคำสั่งที่มีอยู่เพราะพวกเขาจะวิ่งผ่านเปลือกทุบตีเข้าสู่ระบบ (ดูสาย 1)


1
น่าสนใจว่าสิ่งนี้ใช้ได้ผลสำหรับคุณ ฉันลองสิ่งที่คล้ายกันและทุกอย่างดูดีในระหว่างการสร้าง แต่ไม่พบ NPM เมื่อฉันเรียกใช้รูปภาพที่เป็นผลลัพธ์ การตั้งค่าอย่างชัดเจนNVM_DIR(ดังที่แสดงในคำตอบอื่น ๆ ) แก้ไขให้ฉัน
esmail

2
@esmail แปลกเพราะRUNคำสั่งแรกตั้งค่าNVM_DIRใน~/.bashrc.
Dominic Roy-Stang

2
@ DominicRoy-Stang จุดที่ถูกต้อง. ภาพที่ผมทำงานกับการใช้ประโยชน์และดังนั้นจึงละเว้นsh .bashrcนอกจากนี้คุณแน่ใจหรือไม่ว่า.bashrcมีที่มาจริงๆก่อนที่จะดำเนินการRUNคำสั่ง? ในการทดสอบสั้น ๆ กับbashภาพอย่างเป็นทางการดูเหมือนว่าจะไม่ใช่
esmail

2
@esmail คือที่อยู่บรรทัดแรก ( SHELLคำสั่ง) ทำให้คำสั่ง RUN ติดต่อกันใช้เชลล์ล็อกอินซึ่งเป็นแหล่งที่มาของ.bashrcไฟล์ หมายเหตุ: จะใช้ได้เฉพาะเมื่อคำสั่งรันในโหมดเชลล์เช่น RUN nvm --version. จะไม่ทำงานหากคำสั่งทำงานในโหมด exec เช่น RUN ["nvm", "--version"]. ฉันได้อัปเดตลิงก์ที่ฉันให้ไว้สำหรับแบบฟอร์มเชลล์เพื่อหวังว่าจะทำให้ชัดเจนยิ่งขึ้น
Dominic Roy-Stang

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

โปรดทราบว่าnvmไม่ใช่คำสั่ง bash แต่เป็นนามแฝง $PATHนี้สามารถสกรูคุณขึ้นถ้าคุณอาศัย


10

ตามคำแนะนำในคำตอบ @Kuhess ฉันแทนที่คำสั่ง source ด้วยสิ่งต่อไปนี้ใน Dockerfile ของฉัน

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

10

ฉันใช้เวลาหนึ่งหรือสองชั่วโมงเพื่อหาวิธีที่สะอาดที่สุด - ล็อกอินดูเหมือนจะไม่เรียกใช้. 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

ฉันใช้ ubuntu 19:10 เป็นภาพพื้นฐาน ฉันจะโพสต์คำแนะนำ Docker ที่เกี่ยวข้องทั้งหมดเพื่อให้คุณมีความคิดว่าอะไรที่เหมาะกับฉัน คำแนะนำใด ๆ ที่ฉันทิ้งไว้อาจไม่เกี่ยวข้องหรือไม่สามารถให้ได้ ฉันจะแสดงความคิดเห็นแทนพวกเขา ฉันจะโพสต์ไว้ในความคิดเห็นถัดไปเนื่องจากกำหนดจำนวนอักขระต่ำเกินไป
user2896438

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

นี่เป็นทางออกเดียวที่ใช้ได้กับฉันกับคอนเทนเนอร์ ubuntu 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เช่นกัน ฉันพบว่าบางแพ็คเกจไม่ได้รับการติดตั้งภายในนักเทียบท่าเว้นแต่จะเสร็จสิ้น


ใช่ - ผู้ชาย - ลองวิธีแก้ปัญหามากกว่า 100 รายการและมีเพียงคุณเท่านั้นที่ใช้ได้ผล - 10x!
srfrnk

ถูกต้องในการใช้ ~ / .nvm / nvm-tmp.sh ดังนั้นเวอร์ชันโหนดจึงถูกติดตั้งอย่างถูกต้องในไดเร็กทอรี ~ / .nvm
guidoman

7

ความแตกต่างที่สำคัญระหว่างความพยายามรับคำสั่ง 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.sh ซึ่งทำให้คำสั่ง nvm อยู่ในเชลล์ของคุณ

ฉันจะไม่แปลกใจถ้านักเทียบท่ากำลังเรียกใช้สิ่งนี้ในเชลล์ที่ไม่ใช่แบบโต้ตอบ สิ่งนี้ไม่ได้ถูกชี้ให้ชัดเจนดังนั้นฉันคิดว่าฉันจะพูดถึงมันเพราะมันเป็นสิ่งที่ดึงดูดฉันเมื่อฉันทำอะไรคล้าย ๆ กับคนเร่ร่อน


ขอขอบคุณที่ค้นหาแหล่งที่มาของปัญหา ฉันคัดลอกไฟล์ /etc/skel/.bashrc ออกจากอิมเมจฐานอูบุนตู 19.10 จากนั้นแสดงความคิดเห็นในบรรทัดที่ไม่เหมาะสมด้านบน จากนั้นใน Dockerfile ของฉันฉันใช้คำสั่ง COPY เพื่อคัดลอก "แก้ไข" /etc/skel/.bashrc ไปยัง / etc / skel และหลังจากนั้นใช้ RUN เพื่อสร้างผู้ใช้โดยมี / bin / bash เป็นเชลล์ จากนั้นการเรียก RUN ["/ bin / bash", "-c", "-l", YOUR_COMMAND [S] _HERE] ในภายหลังก็ทำงานได้ดี
Stephan Doliov

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 (ยืด)) nvm ก็จบลงด้วย$HOME/.nvmเช่นกัน
Dave Stevens

ใช่ลิงก์สัญลักษณ์ก็จำเป็นต้องเพิ่มให้ฉันเช่นกัน ฉันสงสัยว่าคนอื่นไม่ต้องการมันได้อย่างไร
PEZO

1

นี่คือสิ่งที่ใช้ได้ผลสำหรับฉัน (ฉันใช้เดเบียนบัสเตอร์):

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>แล้ว


1

คำตอบเพียงคำตอบเดียวทำให้การติดตั้ง curl แต่ไม่สามารถใช้กับ Dockerfile ทั้งหมดได้

ที่นี่ Dockerfile ของฉันพร้อมที่จะคัดลอก / วางซึ่งฉันติดตั้งnvm 2020 เวอร์ชันล่าสุดด้วยUbuntu 18.04.3 LTS

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.