Làm thế nào để cài đặt nvm trong docker?


101

Tôi đang trong quá trình xây dựng hình ảnh Docker mới và tôi đang tìm cách cài đặt NVM để có thể quản lý nodejs.

Đọc các tài liệu về cách cài đặt NVM, họ đề cập rằng bạn cần phải mã nguồn tệp .bashrc của mình để bắt đầu sử dụng NVM.

Tôi đã cố gắng thiết lập điều này trong Dockerfile, nhưng cho đến nay việc xây dựng không thành công với lỗi:

"bash: nvm: không tìm thấy lệnh"

Dưới đây là các dòng có liên quan từ Dockerfile của tôi:

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"

Đây là kết quả từ việc cố gắng xây dựng:

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

Tôi khá mới với Docker vì vậy tôi có thể thiếu một số thứ cơ bản để viết Dockerfiles, nhưng cho đến nay tất cả các bài đọc mà tôi đã thực hiện vẫn chưa cho tôi thấy một giải pháp tốt.


11
Không phải là một trùng lặp vì đây là đặc biệt để lắp đặt bên trong Docker và không phải là một tiêu chuẩn cài đặt
David Ficociello

Vì bạn chỉ cài đặt một phiên bản nút duy nhất, nên có vẻ như không cần cài đặt nvm. Các tệp Docker được cung cấp bởi kho lưu trữ nút Docker có thể được sử dụng làm tài liệu tham khảo về cách cài đặt nút.
mikwat

Câu trả lời:


121

Khi bạn RUN bash...chạy trong một quy trình riêng biệt, bất kỳ thứ gì được đặt trong môi trường sẽ không được duy trì. Đây là cách tôi cài đặt 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

để tăng tốc nó trong hai lần chỉ cần thay đổi v0.20.0thànhv0.24.1
itsnikolay

8
với nvm 0.31.0và nút v4.2.3con đường là/usr/local/nvm/versions/node/v4.2.3/bin
cwhsu

4
@thiagoh Điều này không giải thích tại sao cài đặt nvm của người hỏi không hoạt động và các câu trả lời hoạt động vẫn hoạt động. Nó không liên quan gì đến shell chạy trong các tiến trình riêng biệt. Đó là bởi vì câu hỏi cố gắng nguồn bash.rc để tải tệp nvm.sh tải lệnh nvm vào bash, nhưng bash.rc thoát sớm khi chạy không tương tác, vì vậy lệnh nvm không được tải. Tất cả các câu trả lời thành công đều nguồn nvm.sh trực tiếp thay vì thực hiện qua bash.rc. Đây là chìa khóa để làm cho công việc này.
tobuslieven

2
Thay vì thay thế sh bằng bash, bạn có thể làm đơn giản . $NVM_DIR/nvm.sh, tránh mã nhị phân nguồn.
Razvan Grigore

3
Điều này đã kết thúc, nhưng các đường dẫn cần điều chỉnh một chút, phải là: ENV NODE_PATH $ NVM_DIR / maps / node / v $ NODE_VERSION / lib / node_modules ENV PATH $ NVM_DIR / maps / node / v $ NODE_VERSION / bin: $ PATH
Lunulata

31

Để giúp tất cả những ai đang tìm cách cài đặt Node.js với NVM trên Ubuntu (phiên bản cuối cùng), tôi đã tạo tệp dockerfile bên dưới. Tôi đang sử dụng phiên bản cuối cùng của Docker, Ubuntu, Node.js và NVM đang hoạt động bình thường ($ PATH đã được sửa). Tôi đang sử dụng cái này trong môi trường sản xuất.

$ 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
không nên NODE_PATH là ENV NODE_PATH $ NVM_DIR / version / node / v $ NODE_VERSION / lib / node_modules
Sentient

Xin chào @Sentient! Tôi đang chạy docker này trong môi trường sản xuất (ubuntu) và nhà phát triển cục bộ (OSX), cả hai đều hoạt động bình thường, không có lỗi. Bạn có thể đang chạy một NVM lỗi thời không?
danilodeveloper

Có lý do gì tôi nên sử dụng SUDO khi cài đặt build-essential và libssl-dev không? Tôi hoàn toàn không phải là một DevOps dày dạn kinh nghiệm.
a.barbieri

1
Điều quan trọng làsource $NVM_DIR/nvm.sh && nvm install $NODE_VERSION
Vladimir Kornea

24

Đường dẫn nvm đã thay đổi kể từ câu trả lời được chấp nhận, vì vậy nếu bạn muốn sử dụng phiên bản nvm cập nhật hơn, bạn cần thực hiện một vài thay đổi. Ngoài ra, không cần thiết phải sửa lại shđể làm cho nó hoạt động:

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

Không chắc liệu bạn có cần --delete-prefixtùy chọn trên nvm use- Tôi đã làm, nhưng đó có thể là điều gì đó kỳ lạ về hình ảnh cơ sở của tôi.


1
Tiết kiệm cuộc sống! Giá như tôi thấy câu trả lời của bạn 3 giờ trước.
Adrian Marinica

Làm việc cho tôi, cơ sở php image: 7.1.1
Toby Mellor

18

Mỗi RUNtệp trong Dockerfile được thực thi trong một vùng chứa khác nhau. Vì vậy, nếu bạn nguồn tệp trong vùng chứa, nội dung của tệp sẽ không có sẵn trong tệp tiếp theo.

Đó là lý do tại sao khi bạn cài đặt một ứng dụng và bạn cần thực hiện một số bước, bạn phải thực hiện nó trong cùng một vùng chứa.

Với ví dụ của bạn:

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

OK, Cảm ơn bạn rất nhiều vì lời giải thích. Vì vậy, tôi đã sửa đổi tập lệnh của mình để trông giống như sau: `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 "] THÊM tệp / nginx.conf / etc / nginx / EXPOSE 22` Tôi gặp lỗi sau: `/ bin / bash: /root/nvm_install.sh: / bin / bash: bad thông dịch viên: file văn bản bận rộn '
David Ficociello

Lỗi này phải được liên kết với dòng của bạn RUN ["/bin/bash", ...]. Nó không được bao quanh bởi [...]và bạn không cần chỉ định thông dịch viên /bin/bash -c.
Kuhess

17

Điều này dựa trên câu trả lời hàng đầu và hoạt động vào năm 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

Lưu ý rằng đó nvmkhông phải là lệnh bash, nó là một bí danh. Điều này có thể khiến bạn khó chịu nếu bạn đang dựa dẫm $PATH.


15

Cập nhật 20/02/2020 : Giải pháp này hoạt động nếu bạn đang sử dụng debianhình ảnh cơ sở. Nếu bạn đang sử dụng ubuntu, hãy xem câu trả lời này .

Đây là cách cài đặt sạch sẽ nhất nvmmà tôi đã tìm thấy:

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

Giải trình

  • Dòng đầu tiên đặt trình bao mặc định của Dockerfile thành trình bao đăng nhập bash . Lưu ý: điều này có nghĩa là mọi lần tiếp theo RUN, CMDENTRYPOINTsẽ được chạy dưới người dùng hiện tại (thường là root), và tạo nguồn cho tệp ~ / .bashrc nếu chạy ở dạng shell .

  • Dòng thứ hai cài đặt nvmbằng bash. Khi tập lệnh được chạy với bash, nó sẽ gắn vào tệp ~ / .bashrc .

  • Dòng thứ ba cài đặt một phiên bản nodejs cụ thể và sử dụng nó. Các nvm, npmnodecác lệnh có sẵn vì họ đang chạy qua một vỏ bash đăng nhập (xem dòng 1).


1
Cảm ơn bạn rất nhiều !
Gaui

Thật thú vị rằng điều này đã làm việc cho bạn. Tôi đã thử một cái gì đó tương tự và mọi thứ trông ổn trong khi xây dựng, nhưng không tìm thấy NPM khi tôi chạy hình ảnh kết quả. Cài đặt rõ ràng NVM_DIR(như được hiển thị trong một số câu trả lời khác) đã sửa nó cho tôi.
esmail

1
@esmail thật lạ vì RUNlệnh đầu tiên được đặt NVM_DIRtrong ~/.bashrc.
Dominic Roy-Stang

1
@ DominicRoy-Stang, điểm hợp lệ. Hình ảnh tôi đã làm việc với các sử dụng shvà do đó bỏ qua .bashrc. Ngoài ra, bạn có chắc chắn .bashrclà thực sự có nguồn gốc trước khi thực hiện RUNcác lệnh? Trong thử nghiệm ngắn của tôi với bashhình ảnh chính thức , có vẻ như không phải vậy.
esmail

1
@esmail đó là SHELLđịa chỉ của dòng đầu tiên ( hướng dẫn). Nó làm cho các lệnh RUN liên tiếp sử dụng một trình bao đăng nhập nguồn .bashrctệp. Lưu ý: nó chỉ hoạt động nếu các lệnh được chạy ở chế độ shell, ví dụ. RUN nvm --version. Nó sẽ không hoạt động nếu các lệnh được chạy trong chế độ thực thi, ví dụ. RUN ["nvm", "--version"]. Tôi đã cập nhật liên kết mà tôi cung cấp cho biểu mẫu shell để hy vọng làm cho điều này rõ ràng hơn.
Dominic Roy-Stang

10

Dựa trên gợi ý trong câu trả lời @Kuhess, tôi đã thay thế lệnh nguồn bằng lệnh sau trong Dockerfile của mình

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

8

Đây là phiên bản làm việc của tôi

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;

Nhận trợ giúp từ câu trả lời @abdulljibali và @shamisis.


Tìm nguồn cung ứng ~/.nvm/nvm.shtệp là chìa khóa tôi cần.
Stephane

Đây là giải pháp duy nhất phù hợp với tôi với vùng chứa ubuntu 16.04.2.
drohm

7

Tôi phải bắt đầu với thực tế là tôi đã tìm kiếm khắp nơi để lấy một ví dụ hoạt động nvmbên trong dockervà tôi không tìm thấy. Ngay cả các câu trả lời trong chủ đề này đã không hoạt động.

Vì vậy, tôi đã dành khá nhiều thời gian và tìm ra một cách hoạt động:

# 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;

Lưu ý cách tôi đã cài đặt nodejsthông qua apt-get. Tôi thấy rằng một số gói không được cài đặt bên trong docker trừ khi điều này được thực hiện.


vâng - người đàn ông - đã thử khoảng 100 giải pháp và chỉ có giải pháp của bạn hoạt động - 10 lần!
srfrnk

Đúng khi sử dụng ~ / .nvm / nvm-tmp.sh, vì vậy các phiên bản nút được cài đặt chính xác bên trong thư mục ~ / .nvm
Guidoman

6

Sự khác biệt chính giữa nỗ lực lấy lệnh nvm trong câu hỏi:

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

mà không hoạt động và cố gắng làm điều tương tự trong câu trả lời được chấp nhận:

source $NVM_DIR/nvm.sh

Đó có phải là phiên bản thứ hai cung cấp trực tiếp tập lệnh nvm.sh, trong khi phiên bản gốc cố gắng thực hiện điều đó thông qua tệp .bashrc.

Tệp .bashrc có một dòng trong đó sớm thoát ra nếu nó đang được chạy trong một trình bao không tương tác:

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

Vì vậy, nó không bao giờ đi đến chỗ mà nó sẽ có nguồn nvm.sh thực sự đặt lệnh nvm trong trình bao của bạn.

Tôi sẽ không ngạc nhiên nếu docker đang chạy công cụ này trong một trình bao không tương tác. Điều này đã không được chỉ ra một cách rõ ràng, vì vậy tôi nghĩ tôi sẽ đề cập đến nó vì đó là điều khiến tôi phát hiện ra khi tôi đang làm điều gì đó tương tự với người lang thang.


Cảm ơn vì đã tìm ra nguồn gốc của vấn đề. Tôi đã sao chép tệp /etc/skel/.bashrc từ hình ảnh ubuntu 19.10 cơ sở và sau đó nhận xét các dòng vi phạm ở trên. Sau đó, trong Dockerfile của mình, tôi đã sử dụng lệnh COPY để sao chép /etc/skel/.bashrc "đã sửa" thành / etc / skel và chỉ sau đó sử dụng RUN để tạo người dùng với / bin / bash làm trình bao của họ. Sau đó, các lệnh gọi tiếp theo tới RUN ["/ bin / bash", "-c", "-l", YOUR_COMMAND [S] _HERE] hoạt động tốt.
Stephan Doliov

6

Tôi đã mất một hoặc hai giờ để tìm ra cách hợp lý nhất để làm việc đó. --login dường như không thực thi .bashrc vì vậy bạn phải cung cấp -i để khởi chạy nó ở chế độ tương tác. Điều này khiến Docker hét vào mặt bạn một chút vì vậy tôi chỉ khởi chạy theo cách này để cài đặt, sau đó đặt lại về trình bao tiêu chuẩn của tôi.

# 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"]

Câu trả lời của bạn khiến tôi nhận ra rằng của tôi không hoạt động ubuntukhi sử dụng làm hình ảnh cơ sở (nhưng của bạn thì có). Tôi đã sử dụng debianhình ảnh dựa trên. Tôi không chắc điều gì gây ra sự khác biệt giữa cả hai. Bất kỳ ý tưởng?
Dominic Roy-Stang

Tôi đang sử dụng ubuntu 19:10 làm hình ảnh cơ sở. Tôi sẽ đăng tất cả các hướng dẫn Docker có liên quan để bạn có ý tưởng về những gì phù hợp với tôi. Bất kỳ hướng dẫn nào tôi đã bỏ qua đều không liên quan hoặc tôi không thể cung cấp. Tôi sẽ đại diện cho họ với một bình luận. Tôi sẽ đăng nó trong nhận xét tiếp theo vì giới hạn ký tự được đặt quá thấp
dùng2896438

4

Không có cái nào trong số này phù hợp với tôi, đối với vùng python3-onbuildchứa của tôi, tôi phải buộc tạo các liên kết tượng trưng đến cài đặt 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

Đã đồng ý. Khi cài đặt trong bộ chứa docker (Debian GNU / Linux 9 (căng)), nvm cũng kết thúc $HOME/.nvmvới tôi.
Dave Stevens

Vâng, các liên kết tượng trưng cũng cần thiết để thêm vào tôi. Tôi đang tự hỏi làm thế nào những người khác thậm chí không cần nó.
PEZO

0

Đây là những gì phù hợp với tôi (tôi đang sử dụng debian buster):

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"]

Bây giờ bạn sẽ có thể làm nvm install <version>.


0

Chỉ một câu trả lời đặt cài đặt curl nhưng không hoạt động toàn bộ Dockerfile

Đây là tệp Dockerfile của tôi đã sẵn sàng để sao chép / dán trong đó tôi cài đặt phiên bản nvm 2020 mới nhất với 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
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.