26

命令 :

docker build -t nginx-ubuntu . 

下面的 Dockerfile :

来自 ubuntu:12.10
运行 apt-get 更新
运行 apt-get -y install libpcre3 libssl-dev
运行 apt-get -y 安装 libpcre3-dev
运行 apt-get -y 安装 wget zip gcc
运行 wget http://nginx.org/download/nginx-1.4.1.tar.gz
运行 gunzip nginx-1.4.1.tar.gz
运行 tar -xf nginx-1.4.1.tar
运行 wget --no-check-certificate https://github.com/max-l/nginx_accept_language_module/archive/master.zip
运行解压大师
运行 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-牛

在最后一行失败(./configure ...)

如果我删除最后一行并在容器中运行 bash,然后手动执行最后一行,它就可以工作。

我希望当命令附加在 Dockerfile 中(以 RUN 为前缀)时,在容器中成功运行的任何命令都应该可以工作

我错过了什么吗?

4

3 回答 3

49

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
于 2013-07-26T22:24:16.367 回答
28

作为@creak 答案的替代方案,您可以使用以下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开关覆盖)。

于 2014-04-04T18:43:38.950 回答
2

当我调用wgettar使用 RUN 时,我需要指定一个路径,如果你想使用 WORKDIR 作为它的路径,看起来 ADD 是正确的方法。因此,以下任何一项都解决了我的问题。

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。

于 2016-06-08T03:10:19.770 回答