Docker构建无法在Dockerfile中使用的bash脚本中从archive.ubuntu.com获取包



试图在Dockerfile中执行先决条件安装脚本来构建docker映像,但无法通过archive.ubuntu.com中的apt-get获取包。

在Dockerfile中使用apt-get命令可以完美地工作,尽管它位于通过Dockerfile的ENV命令设置的公司代理之后。无论如何,从结果docker容器内的终端中的bash脚本执行apt-get命令,或者作为";postCreateCommand";在Visual Studio的devcontainer.json中,Code也按预期工作。但在我的情况下,从Dockerfile内部调用bash脚本是不起作用的。它只会告诉我们:

Starting installation of package iproute2
Reading package lists...
Building dependency tree...
The following additional packages will be installed:
libatm1 libcap2 libcap2-bin libmnl0 libpam-cap libxtables12
Suggested packages:
iproute2-doc
The following NEW packages will be installed:
iproute2 libatm1 libcap2 libcap2-bin libmnl0 libpam-cap libxtables12
0 upgraded, 7 newly installed, 0 to remove and 0 not upgraded.
Need to get 971 kB of archives.
After this operation, 3,287 kB of additional disk space will be used.
Err:1 http://archive.ubuntu.com/ubuntu focal/main amd64 libcap2 amd64 1:2.32-1
Could not resolve 'archive.ubuntu.com'
... more output ...
E: Failed to fetch http://archive.ubuntu.com/ubuntu/pool/main/libc/libcap2/libcap2_2.32-1_amd64.deb  Could not resolve 'archive.ubuntu.com'
... more output ...

举个例子,Dockerfile的一个片段如下:

FROM ubuntu:20.04 as builderImage
USER root
ARG HTTP_PROXY_HOST_IP='http://172.17.0.1'
ARG HTTP_PROXY_HOST_PORT='3128'
ARG HTTP_PROXY_HOST_ADDR=$HTTP_PROXY_HOST_IP':'$HTTP_PROXY_HOST_PORT
ENV http_proxy=$HTTP_PROXY_HOST_ADDR
ENV https_proxy=$http_proxy
ENV HTTP_PROXY=$http_proxy
ENV HTTPS_PROXY=$http_proxy
ENV ftp_proxy=$http_proxy
ENV FTP_PROXY=$http_proxy
# it is always helpful sorting packages alpha-numerically to keep the overview ;)
RUN apt-get update && 
apt-get -y upgrade && 
apt-get -y install --no-install-recommends apt-utils dialog 2>&1 
&& 
apt-get -y install 
default-jdk 
git 
python3 python3-pip
SHELL ["/bin/bash", "-c"]
ADD ./env-setup.sh .
RUN chmod +x env-setup.sh && ./env-setup.sh
CMD ["bash"]

应该由Dockerfile调用的环境脚本env-setup.sh的最低版本如下所示:

#!/bin/bash
packageCommand="apt-get";
sudo $packageCommand update;
packageInstallCommand="$packageCommand install";
package="iproute2"
packageInstallCommand+=" -y";
sudo $packageInstallCommand $package;

当然,变量的使用取决于使用要安装的软件包的列表和其他方面。

希望这已经涵盖了问题的所有关键内容:

为什么apt-get的执行与RUN一起工作,并在创建后在容器内运行bash脚本,而不是在从Dockerfile构建图像时使用相同的bash脚本?

我希望在广泛的网络搜索的帮助下找到答案,但不幸的是,我只能找到这个案例的答案。

正如问题下方的评论部分所指出的:

使用sudo启动命令,清除当前环境中设置的所有当前变量,更具体地说,清除您的代理设置

就是这样。

解决方案是从bash脚本中删除sudo,然后在Dockerfile中以root身份调用该脚本。

或者,使用sudo将使用ENV变量,只需应用sudo -E即可。

相关内容

  • 没有找到相关文章

最新更新