命令:
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为前缀)
我错过了什么吗?答案 0 :(得分:39)
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
答案 1 :(得分: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
开关覆盖)时,这也会影响默认目录。
答案 2 :(得分:2)
当我使用RUN调用wget
或tar
时我需要指定一个路径,如果你想使用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
或
添加强>
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。