Docker命令在构建期间失败,但在运行容器中执行时成功

Max*_* L. 23 docker

命令 :

docker build -t nginx-ubuntu . 
Run Code Online (Sandbox Code Playgroud)

下面的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为前缀),在容器中成功运行的任何命令都应该有效

我错过了什么吗?

cre*_*ack 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
Run Code Online (Sandbox Code Playgroud)

  • 我明白了,所以我猜每个RUN命令都有一个新的上下文,因为什么都没有保留.感谢您及时的回复 ! (4认同)
  • 使用WORKDIR而不是cd.见@ alanfalloon的回答. (3认同)

ala*_*oon 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
Run Code Online (Sandbox Code Playgroud)

当您使用docker run(由-w交换机覆盖)时,这也会影响默认目录.

  • +1`WORKDIR`是在容器构建期间设置工作目录的正确方法,因为它适用于跟随它的所有'RUN`,`CMD`,`ENTRYPOINT`,`COPY`和`ADD`指令". (8认同)