2013-07-26 5 views
19

के भीतर क्रियान्वित सफल होता है:डोकर आदेश निर्माण के दौरान विफल रहता है, लेकिन जब तक आदेश चलाकर कंटेनर

docker build -t nginx-ubuntu . 
Dockerfile whith नीचे

:

 
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 

आखिरी पंक्ति (कॉन्फ़िगर पर विफल ...)

यदि मैं अंतिम पंक्ति को हटाता हूं और कंटेनर में एक बैश चलाता हूं, और मैन्युअल रूप से अंतिम पंक्ति निष्पादित करता है, तो यह काम करता है।

मैं उम्मीद होती है कि जो कुछ भी आदेश एक कंटेनर के भीतर सफलतापूर्वक चलता काम करना चाहिए जब आदेश Dockerfile (दौड़ लगाया जाता है)

मैं कुछ याद आ रही है में जोड़ दिया जाता है?

उत्तर

35

पीडब्ल्यूडी रन आदेशों में लगातार नहीं है। आपको एक ही रन के भीतर सीडी और कॉन्फ़िगर करने की आवश्यकता है।

यह 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

मुझे लगता है, तो मुझे लगता है कि प्रत्येक रन कमांड का एक नया संदर्भ है, क्योंकि कुछ भी संरक्षित नहीं है। शीघ्र जवाब देने के लिए ध्न्यवाद ! –

+0

@ MaxL.yes, यह सही है। –

+1

सीडी के बजाय वर्कडीर का प्रयोग करें। @ एलानफ्लून का जवाब देखें। – emisilva

25

@ चरमराहट के जवाब के लिए एक विकल्प के रूप में, आप WORKDIR कमांड के साथ एक Dockerfile में डिफ़ॉल्ट कार्यशील निर्देशिका बदल सकते हैं:

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 'वर्कडीर' एक कंटेनर बिल्ड के दौरान कार्यशील निर्देशिका को सेट करने का सही तरीका है, क्योंकि यह सभी ''रन', 'सीएमडी', 'एंटरपॉइंट', 'कॉपी' और 'एडीडी' निर्देशों पर लागू होता है जो अनुसरण करते हैं यह। – ThatsNinja

+0

यह मेरे लिए काम नहीं करता है। जब मैं वर्कडीर बदलता हूं तो फ़ाइल उपलब्ध नहीं होती है – Pumphouse

1

जब मैं wget या tar भागो मैं एक पथ निर्दिष्ट करने के लिए आवश्यक के साथ कहा जाता है, ऐसा लगता है जैसे जोड़ें सही दृष्टिकोण है आप WORKDIR उपयोग करने के लिए के रूप में यह पथ के बजाय है चाहते हैं। तो नीचे दिए गए किसी भी मुद्दे ने मेरी समस्या का समाधान किया।

भागो

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 

या

जोड़ें

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 इंस्टॉल किए जाने से रोके।

संबंधित मुद्दे