2013-07-26 159 views
19

命令執行成功:泊塢窗命令失敗,但在內部運行容器

docker build -t nginx-ubuntu . 

蒙山的Dockerfile如下:

 
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 

未能在最後一行時(./configure ... )

如果我刪除最後一行並在容器中運行一個bash,並且 手動執行最後一行,它將起作用。

我希望,無論命令運行成功的容器內應該工作 當命令

我這麼想的Dockerfile(由RUN前綴)附加?

回答

35

pwd在RUN命令中不是永久的。您需要在同一個RUN中進行cd和配置。

這Dockerfile正常工作:

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

我明白了,所以我猜想每個RUN命令都有一個新的上下文,因爲在任何情況下都不會保留。感謝您及時的回覆 ! –

+0

@ MaxL.yes,這是正確的。 –

+1

使用WORKDIR而不是cd。請參閱@ alanfalloon的答案。 – emisilva

25

作爲替代@吱吱的回答,您可以在Dockerfile與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 

這也影響當您使用docker run(由-w交換機覆蓋)時,將使用默認目錄。

+5

+1'WORKDIR'是在容器構建期間設置工作目錄的正確方法,因爲它適用於所有後續的「RUN」,「CMD」,「ENTRYPOINT」,「COPY」和「ADD」指令它'。 – ThatsNinja

+0

這不適合我。當我更改WORKDIR時,該文件不可用 – Pumphouse

1

當我使用RUN調用wgettar時,我需要指定一個路徑,如果您想使用WORKDIR作爲路徑,則看起來像ADD是正確的方法。所以下面的任何一個解決了我的問題。

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 

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 

第二種方法阻止我需要在容器中安裝的wget。