试图在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
即可。