2013-07-26 13 views
19

il comando:comando Docker non riesce durante la costruzione, ma riesce mentre eseguito entro l'esecuzione contenitore

docker build -t nginx-ubuntu . 

whith il Dockerfile di seguito:

 
FROM ubuntu:12.10 
RUN apt-get update 
RUN apt-get -y install libpcre3 libssl-dev 
RUN apt-get -y install libpcre3-dev 
RUN apt-get -y install wget zip gcc 
RUN wget http://nginx.org/download/nginx-1.4.1.tar.gz 
RUN gunzip nginx-1.4.1.tar.gz 
RUN tar -xf nginx-1.4.1.tar 
RUN wget --no-check-certificate https://github.com/max-l/nginx_accept_language_module/archive/master.zip 
RUN unzip master 
RUN cd nginx-1.4.1 
RUN ./configure --add-module=../nginx_accept_language_module-master --with-http_ssl_module --with-pcre=/lib/x86_64-linux-gnu --with-openssl=/usr/lib/x86_64-linux-gnu 

cede a l'ultima riga (./configure ...)

Se rimuovo l'ultima riga ed eseguo una bash nel contenitore, e esegue l'ultima riga manualmente, funziona.

Mi aspetterei che qualunque comando esegue con successo all'interno di un contenitore dovrebbe funzionare quando il comando viene aggiunto nel Dockerfile (preceduto da RUN)

mi sto perdendo qualcosa?

risposta

35

Il pwd non è persistente tra i comandi RUN. È necessario eseguire il cd e configurare nello stesso ESEGUI.

Questo Dockerfile funziona bene:

FROM ubuntu:12.10 
RUN apt-get update 
RUN apt-get -y install libpcre3 libssl-dev 
RUN apt-get -y install libpcre3-dev 
RUN apt-get -y install wget zip gcc 
RUN wget http://nginx.org/download/nginx-1.4.1.tar.gz 
RUN gunzip nginx-1.4.1.tar.gz 
RUN tar -xf nginx-1.4.1.tar 
RUN wget --no-check-certificate https://github.com/max-l/nginx_accept_language_module/archive/master.zip 
RUN unzip master 
RUN cd nginx-1.4.1 && ./configure --add-module=../nginx_accept_language_module-master --with-http_ssl_module --with-pcre=/lib/x86_64-linux-gnu --with-openssl=/usr/lib/x86_64-linux-gnu 
+4

Vedo, quindi suppongo che ogni comando RUN abbia un nuovo contesto, poiché nel nulla non viene conservato. Grazie per la risposta rapida ! –

+0

@ MaxL.yes, è corretto. –

+1

Usa WORKDIR invece di cd. Vedi la risposta di @ alanfalloon. – emisilva

25

In alternativa alla risposta @ di scricchiolio, è possibile modificare la directory di lavoro predefinita in un Dockerfile con il comando WORKDIR:

FROM ubuntu:12.10 
# Run update & install together so that the docker cache doesn't 
# contain an out-of-date APT cache (leading to 404's when installing 
# packages) 
RUN apt-get update && DEBIAN_FRONTEND=noninteractive apt-get -y install libpcre3 libssl-dev libpcre3-dev wget zip gcc 
ADD http://nginx.org/download/nginx-1.4.1.tar.gz nginx-1.4.1.tar.gz 
RUN tar -zxf nginx-1.4.1.tar.gz 
RUN wget --no-check-certificate https://github.com/max-l/nginx_accept_language_module/archive/master.zip 
RUN unzip master 
WORKDIR nginx-1.4.1 
RUN ./configure --add-module=../nginx_accept_language_module-master --with-http_ssl_module --with-pcre=/lib/x86_64-linux-gnu --with-openssl=/usr/lib/x86_64-linux-gnu 

Questo riguarda anche il directory predefinita quando si utilizza docker run (sovrascritto dall'interruttore -w).

+5

+1 'WORKDIR' è il modo corretto per impostare la directory di lavoro durante la compilazione di un contenitore, poiché si applica a tutte le istruzioni di' 'RUN',' CMD', 'ENTRYPOINT',' COPY' e 'ADD' che seguono E'. – ThatsNinja

+0

questo non funziona per me. Il file non è disponibile quando cambio WORKDIR – Pumphouse

1

Quando ho chiamato wget o tar con RUN, avevo bisogno di specificare un percorso, sembra che ADD sia l'approccio corretto se si desidera utilizzare WORKDIR come invece è il percorso. Quindi uno dei seguenti ha risolto il mio problema.

RUN

RUN wget http://nginx.org/download/nginx-1.4.1.tar.gz -P ~/directory 
RUN tar -zxf ~/directory/nginx-1.4.1.tar.gz -C ~/directory 

o

ADD

WORKDIR ~/directory 
ADD http://nginx.org/download/nginx-1.4.1.tar.gz nginx-1.4.1.tar.gz 
RUN tar -zxf nginx-1.4.1.tar.gz 

Il secondo approccio mi ha impedito di dover installare wget nel contenitore.

Problemi correlati