嘗試通過在 Dockerfile 中執行先決條件安裝腳本來構建 docker 映像,無法通過 apt-get 從archive.ubuntu.com獲取包。
apt-get盡管在企業代理之后,使用Dockerfile 中的命令可以完美地作業,該代理是通過ENVDockerfile 中的命令設定的。無論如何,apt-get從生成的 docker 容器內的終端中的 bash 腳本執行命令,或者在 Visual Studio Code 的 devcontainer.json 中作為“postCreateCommand”執行命令也可以按預期作業。但在我的情況下,它不適用于從 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"]
env-setup.sh應該由 Dockerfile 呼叫的環境腳本的最小版本如下所示:
#!/bin/bash
packageCommand="apt-get";
sudo $packageCommand update;
packageInstallCommand="$packageCommand install";
package="iproute2"
packageInstallCommand =" -y";
sudo $packageInstallCommand $package;
當然,變數的使用歸結為使用要安裝的包的串列和其他方面。
希望這已經涵蓋了該問題所必需的所有內容:
為什么在創建后apt-get使用 aRUN并在容器內運行 bash 腳本,而不是在從 Dockerfile 構建映像時使用相同的 bash 腳本?
我希望在廣泛的網路搜索的幫助下找到答案,但不幸的是,除了這個案例的答案,我只能找到任何東西。
uj5u.com熱心網友回復:
正如問題下方的評論部分指出的那樣:
使用 sudo 啟動命令,清除當前環境中設定的所有當前變數,更具體地說是您的代理設定
所以就是這樣。解決方案是從 bash 腳本中洗掉 sudo 并在 Dockerfile 中以 root 身份呼叫該腳本。
轉載請註明出處,本文鏈接:https://www.uj5u.com/yidong/407714.html
標籤:
上一篇:Shell腳本:單引號轉義
下一篇:在ActionController::RoutingError處為::1開始POST"/signup"(未初始化的常量UserController你是說嗎?UsersControl
