2015-09-22 22 views
7

Tôi có một chức năng bash nvm quy định tại /root/.profile. docker build không thể tìm thấy chức năng đó khi tôi gọi nó trong bước RUN.Làm thế nào để chạy chức năng bash trong Dockerfile

RUN apt-get install -y curl build-essential libssl-dev && \ 
    curl https://raw.githubusercontent.com/creationix/nvm/v0.16.1/install.sh | sh 
RUN nvm install 0.12 && \ 
    nvm alias default 0.12 && \ 
    nvm use 0.12 

Lỗi này là

Step 5 : RUN nvm install 0.12 
---> Running in b639c2bf60c0 
/bin/sh: nvm: command not found 

Tôi cố gắng gọi nvm bằng cách gói nó với bash -ic, mà sẽ được tải /root/.profile.

RUN bash -ic "nvm install 0.12" && \ 
    bash -ic "nvm alias default 0.12" && \ 
    bash -ic "nvm use 0.12" 

Các phương pháp trên hoạt động tốt, nhưng nó có một cảnh báo

bash: cannot set terminal process group (1): Inappropriate ioctl for device 
bash: no job control in this shell 

Và tôi muốn biết là có một cách dễ dàng hơn và sạch hơn để gọi hàm bash trực tiếp vì nó là nhị phân bình thường mà không có sự bash -ic gói? Có thể giống như

RUN load_functions && \ 
    nvm install 0.12 && \ 
    nvm alias default 0.12 && \ 
    nvm use 0.12 
+0

'RUN bash -c 'nvm cài đặt 0.12 && nvm bí danh mặc định 0,12 && nvm 0.12'' sử dụng nên làm các trick. Nó làm việc cho bạn? (Tôi không chắc chắn 100% vì tôi không biết container của bạn trông như thế nào) – hek2mgl

+0

Nó hoạt động tốt. Nhưng tôi đang tìm một giải pháp tốt hơn. – Quanlong

+0

Ok, kiểm tra câu trả lời của tôi. Một kịch bản shell là cách sạch nhất để làm điều đó. – hek2mgl

Trả lời

4

Docker RUN không khởi động lệnh trong trình bao. Đó là lý do tại sao chức năng vỏ và cú pháp shell (như cmd1 & & cmd2) không thể được sử dụng ra khỏi hộp. Bạn cần phải gọi vỏ một cách rõ ràng:

RUN bash -c 'nvm install 0.12 && nvm alias default 0.12 && nvm use 0.12' 

Nếu bạn sợ rằng dòng lệnh dài, đặt những lệnh vào một kịch bản shell và gọi script với RUN:

script.sh

#!/bin/bash 

nvm install 0.12 && \ 
nvm alias default 0.12 && \ 
nvm use 0.12 

và làm cho nó thực thi:

chmod +x script.sh 

Trong Dockerfile đặt:

RUN /path/to/script.sh 
+0

Tôi cần chạy nvm trong một số bước khác nhau. Và tôi nghĩ rằng báo giá đúng của 'bash -c' là khó kiểm soát khi các lệnh được định dạng thành nhiều dòng. – Quanlong

+0

Đó là lý do tại sao tôi đã đề xuất sử dụng tập lệnh shell. – hek2mgl

+0

Tôi không hiểu tại sao bạn cần nhiều tập lệnh. bạn có thể giải thích về điều đó không? Một khi tôi nhận được nó tôi có thể đề nghị một cái gì đó. – hek2mgl

Các vấn đề liên quan