2015-09-22 22 views
7

Ho una funzione di bash nvm definita in /root/.profile. docker build non è riuscito a trovare quella funzione quando la chiamo nel passaggio RUN.Come eseguire la funzione bash in 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'errore è

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

sono riuscito a chiamare nvm avvolgendolo con bash -ic, che caricherà /root/.profile.

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

Il metodo di cui sopra funziona bene, ma ha un avvertimento

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

E voglio sapere c'è un modo più semplice e più pulito per chiamare la funzione bash direttamente come è binario normale senza l'bash -ic wrapping? Forse qualcosa di simile

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

nvm 'RUN bash -c' install 0.12 && nvm alias predefinito 0,12 && nvm uso 0.12'' dovrebbe fare il trucco. Per te funziona? (Non sono sicuro al 100% perché non so come il tuo contenitore sta guardando in dettaglio) – hek2mgl

+0

Funziona bene. Ma sto cercando una soluzione migliore. – Quanlong

+0

Ok, controlla la mia risposta. Uno script di shell è il modo più pulito per farlo. – hek2mgl

risposta

4

Docker RUN non avvia il comando in una shell. Ecco perché le funzioni della shell e la sintassi della shell (come cmd1 & cmd2) non possono essere utilizzate fuori dalla scatola. È necessario chiamare il guscio in modo esplicito:

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

Se avete paura di quella lunga linea di comando, mettere questi comandi in uno script di shell e chiamare lo script con RUN:

script.sh

#!/bin/bash 

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

e renderlo eseguibile:

chmod +x script.sh 

In Dockerfile messo:

RUN /path/to/script.sh 
+0

Ho bisogno di eseguire nvm in diversi passaggi. E penso che la citazione corretta di 'bash -c' sia difficile da controllare quando i comandi sono formattati come linee multiple. – Quanlong

+0

Ecco perché ho suggerito di utilizzare uno script di shell. – hek2mgl

+0

Non capisco perché hai bisogno di più script. Puoi approfondire questo? Una volta ottenuto, potrei suggerire qualcosa. – hek2mgl

Problemi correlati