Команда Docker выходит из строя во время сборки, но успешно выполняется в запущенном контейнере

команда:

docker build -t nginx-ubuntu . 

с файлом Docker ниже:

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 в контейнере, и выполните последнюю строку вручную, она работает.

Я бы ожидал, что любая команда, успешно выполняемая в контейнере, должна работать когда команда добавляется в файл Docker (с префиксом RUN)

Мне что-то не хватает?

Ответ 1

pwd не работает в командах RUN. Вам нужно cd и настроить в пределах того же RUN.

Этот файл Docker отлично работает:

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

Ответ 2

В качестве альтернативы ответу @creak вы можете изменить рабочий каталог по умолчанию в файле Docker с помощью команды 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 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).

Ответ 3

Когда я вызывал wget или tar с RUN, мне нужно было указать путь, похоже, что ADD - это правильный подход, если вы хотите использовать WORKDIR как путь. Таким образом, любой из нижеперечисленных вопросов разрешил мою проблему.

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 в контейнер.