【问题标题】:Cannot install packages inside docker Ubuntu image无法在 docker Ubuntu 映像中安装软件包
【发布时间】:2015-02-01 02:46:49
【问题描述】:

我在 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

如何解决这个错误?

【问题讨论】:

    标签: docker ubuntu-14.04


    【解决方案1】:

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

    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-set-selections
    • 由于某种原因这对我不起作用,仍然是相同的“E:无法找到包..”消息
    • "apt-get-update" 和 "apt-get install curl" 工作正常!
    • 我发现docker空间不足时也会出现这个错误。我运行docker image prune 来释放空间,并为我修复了它。
    【解决方案2】:

    来自5月2017 2018 2019 2020 2021 年的docs

    始终将RUN apt-get updateapt-get install 组合在一起 RUN 声明,例如

    RUN apt-get update && apt-get install -y package-bar

    (...)

    RUN 语句中单独使用apt-get update 会导致缓存 问题和后续的apt-get install 指令失败。

    (...)

    使用RUN apt-get update && apt-get install -y 可确保您的 Dockerfile 安装最新的软件包版本,无需进一步编码或手动干预。这种技术被称为“缓存破坏”。

    【讨论】:

      【解决方案3】:

      在 Dockerfile 中添加以下命令:

      RUN apt-get update
      

      【讨论】:

        【解决方案4】:

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

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

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

        【讨论】:

          【解决方案5】:

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

          【讨论】:

            【解决方案6】:

            运行 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 update 来获取正确的包信息并且包安装按预期进行。

            【讨论】:

              【解决方案7】:

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

              希望对你有帮助,祝你好运!

              【讨论】:

              • 您的答案可以通过额外的支持信息得到改进。请edit 添加更多详细信息,例如引用或文档,以便其他人可以确认您的答案是正确的。你可以找到更多关于如何写好答案的信息in the help center
              【解决方案8】:

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

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

              【讨论】:

                猜你喜欢
                • 1970-01-01
                • 2021-09-05
                • 1970-01-01
                • 1970-01-01
                • 1970-01-01
                • 1970-01-01
                • 1970-01-01
                • 1970-01-01
                • 1970-01-01
                相关资源
                最近更新 更多