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

Posted

技术标签:

【中文标题】Docker 命令在构建期间失败,但在正在运行的容器中执行时成功【英文标题】:Docker command fails during build, but succeeds while executed within running container 【发布时间】:2021-12-24 08:48:12 【问题描述】:

命令:

docker build -t nginx-ubuntu . 

下面的 Dockerfile :

来自 ubuntu:12.10 运行 apt-get 更新 运行 apt-get -y 安装 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 为前缀)

我错过了什么吗?

【问题讨论】:

【参考方案1】:

密码在 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 命令都有一个新的上下文,因为没有任何东西被保留。感谢您的快速回复! 使用 WORKDIR 代替 cd。请参阅@alanfalloon 的回答。【参考方案2】:

作为@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 开关覆盖)时,这也会影响默认目录。

【讨论】:

+1 WORKDIR 是在容器构建期间设置工作目录的正确方法,因为它适用于所有 'RUNCMDENTRYPOINTCOPY、和ADD 后面的说明。 这对我不起作用。当我更改 WORKDIR 时文件不可用【参考方案3】:

当我使用 RUN 调用 wgettar 时,我需要指定一个路径,如果你想使用 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。

【讨论】:

以上是关于Docker 命令在构建期间失败,但在正在运行的容器中执行时成功的主要内容,如果未能解决你的问题,请参考以下文章

在公司网络上构建映像期间网络调用失败

AWS Sam package 命令在构建规范期间失败

使用 Travis、AWS Elasticbeanstalk 和 Docker 构建失败

React 应用程序在“npm start”期间工作,但在构建后返回 404

忽略Gradle构建失败并继续构建脚本吗?

TFVC:在 vnext 构建期间删除工作区失败