ChatGPT解决这个技术问题 Extra ChatGPT

无法在 docker Ubuntu 映像中安装软件包

我在 docker 上安装了 Ubuntu 14.04 映像。之后,当我尝试在 ubuntu 映像中安装包时,我无法找到包错误:

apt-get install curl

Reading package lists... Done
Building dependency tree       
Reading state information... Done
E: Unable to locate package curl

如何修复此错误?


C
Connor

是因为镜像中没有包缓存,需要运行:

apt-get update

在安装软件包之前,如果您的命令在 Dockerfile 中,那么您将需要:

apt-get -y install curl

要抑制命令的标准输出,请使用 -qq。例如

apt-get -qq -y install curl

这对我有用,我应该一直运行 -qq
-qq 抑制 Dockerfile 中通常不需要的输出。另一个不错的技巧 - 告诉 debconf 它在非交互式环境中工作: echo 'debconf debconf/frontend select Noninteractive' | debconf 设置选择
出于某种原因,这对我不起作用,仍然是相同的“E:无法找到包..”消息
“apt-get-update”和“apt-get install curl”工作正常!
我发现这个错误也发生在 docker 空间不足时。我运行 docker image prune 以释放空间并为我修复它。
c
creimers

5 月的 docs 2017 2018 2019 2020 2021 2022

始终在同一 RUN 语句中将 RUN apt-get update 与 apt-get install 结合使用,例如 RUN apt-get update && apt-get install -y package-bar (...) 在 RUN 语句中单独使用 apt-get update导致缓存问题和后续的 apt-get 安装指令失败。 (...) 使用 RUN apt-get update && apt-get install -y 可确保您的 Dockerfile 安装最新的软件包版本,无需进一步编码或手动干预。这种技术被称为“缓存清除”。


我必须同意这一点。但是这种行为没有解决办法吗?更不用说它 1)增加了构建时间(因为每次更新都会通过缓存查看是否有旧的东西)和 2)使用可用于更有用的东西的连接/带宽,这很烦人。
我不是 docker wizzzzard,但据我了解,这是必要的,因为容器的覆盖文件系统以及 Dockerfile 中的每一行如何代表一个自包含的“层”。
h
halfer

在 Dockerfile 中添加以下命令:

RUN apt-get update

C
Connor

确保 Dockerfile 中没有任何语法错误,因为这也可能导致此错误。一个正确的例子是:

RUN apt-get update \
    && apt-get -y install curl \
    another-package

这是修复语法错误和添加 apt-get update 的组合,为我解决了问题。


b
because_im_batman

运行 apt-get update 并没有为我解决问题,因为它似乎总是从缓存中读取此命令的结果,并且缓存似乎已损坏。我的怀疑是,如果您有多个具有相同“基本映像”的 docker 容器(对我来说是 python:3.8-slim),就会发生这种情况。

所以,这对我有用:

停止系统中的所有 Docker 容器

docker stop $(sudo docker ps -aq) 

移除所有悬挂的容器

docker container prune 

删除所有悬空图像

docker image prune 

运行这些命令后,docker build 似乎丢失了损坏的缓存并执行了干净的 apt-get 更新,该更新获取了正确的包信息,并且包安装按预期进行。


G
Groboclown

我发现当“apt-get update”运行时,在 /tmp 上安装本地卷会导致权限问题,这会阻止包缓存被填充。希望这不是大多数人所做的事情,但是如果您看到此问题,则需要寻找其他东西。


以司之名

当我尝试安装 jre 时遇到了同样的问题,我尝试了命令“apt-get update”,然后再次尝试“apt install default-jre”,它成功了!

我希望它可以帮助你,祝你好运!


您的答案可以通过额外的支持信息得到改进。请edit添加更多详细信息,例如引用或文档,以便其他人可以确认您的答案是正确的。您可以找到有关如何写出好答案的更多信息in the help center
D
David

尝试在我的 Dockerfile 中安装 cron 和 nginx-extras 时遇到同样的错误。到目前为止,我尝试了所有答案,但没有骰子。

然后我简单地运行 sudo service docker restart 为我解决了这个问题。


u
unnamed-bull

您需要更新 Ubuntu 中的软件包列表:

$ sudo apt-get update
$ sudo apt-get install <package_name>