2013-07-26 30 views
19

lệnh:Docker lệnh thất bại trong xây dựng, nhưng thành công khi thực hiện trong vòng chạy chứa

docker build -t nginx-ubuntu . 

whith Dockerfile dưới đây:

 
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 

Thất bại ở dòng cuối cùng (./configure ...)

Nếu tôi xóa dòng cuối cùng và chạy một bash trong vùng chứa, và thực hiện dòng cuối cùng theo cách thủ công, nó hoạt động.

Tôi hy vọng rằng bất cứ điều gì lệnh chạy thành công trong một container nên làm việc khi lệnh được gắn trong Dockerfile (bắt đầu bằng RUN)

tôi thiếu cái gì?

Trả lời

35

Pwd không liên tục trên các lệnh RUN. Bạn cần phải cd và cấu hình trong cùng một RUN.

Dockerfile này hoạt động tốt:

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

Tôi hiểu, vì vậy tôi đoán mọi lệnh RUN đều có ngữ cảnh mới, vì không có gì được giữ nguyên. Cảm ơn đã phản ứng nhanh chóng ! –

+0

@ MaxL.yes, đúng vậy. –

+1

Sử dụng WORKDIR thay vì cd. Xem câu trả lời của @ alanfalloon. – emisilva

25

Để thay thế cho câu trả lời @ lung lay, bạn có thể thay đổi thư mục làm việc mặc định trong một Dockerfile với lệnh 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 

này cũng ảnh hưởng đến thư mục mặc định khi bạn sử dụng docker run (bị ghi đè bởi khóa chuyển đổi -w).

+5

+1 'WORKDIR' là cách đúng để đặt thư mục làm việc trong khi xây dựng vùng chứa, vì nó áp dụng cho tất cả các lệnh '' RUN', 'CMD',' ENTRYPOINT', 'COPY' và' ADD' theo sau nó '. – ThatsNinja

+0

tính năng này không có tác dụng đối với tôi. Tệp không khả dụng khi tôi thay đổi WORKDIR – Pumphouse

1

Khi tôi gọi wget hoặc tar bằng RUN tôi cần xác định đường dẫn, có vẻ như ADD là phương pháp chính xác nếu bạn muốn sử dụng WORKDIR làm đường dẫn thay thế. Vì vậy, một trong hai bên dưới đã giải quyết được vấn đề của tôi.

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 

hoặc

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 

Cách tiếp cận thứ hai ngăn cản tôi khỏi cần phải cài đặt wget trong container.

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