【问题标题】:Cannot install inside docker container无法安装在 docker 容器内
【发布时间】:2016-09-11 21:40:02
【问题描述】:

我是 docker 的新手,但我遇到了一个我不知道如何解决的问题。

我有一个 jenkins (docker) 映像正在运行,一切都很好。几天前,我创建了一个作业,以便每次发出拉取请求时都可以运行我的 nodejs 测试。作业的构建步骤之一是运行npm install。并且这项工作经常因为这个错误而失败:

tar (child): bzip2: Cannot exec: No such file or directory

所以,我知道我必须在 jenkins 容器中安装 bzip2,但我该怎么做呢?我已经尝试运行docker run jenkins bash -c "sudo apt-get bzip2",但我得到了:bash: sudo: command not found

话虽如此,我该怎么做呢?

提前致谢。

【问题讨论】:

    标签: node.js jenkins docker dockerfile


    【解决方案1】:

    这里有很多问题,但最大的问题是您需要使用所需的工具构建映像,而不是安装在正在运行的容器中。正如 techtrainer 所提到的,图像是不可变的并且不会更改(至少从您正在运行的容器中),并且容器是一次性的(因此,当您重新启动它们时,您在其中所做的任何更改都会丢失,除非您的数据存储在容器外部的卷中)。

    我不同意 techtrainer 在容器中进行更改并将它们提交到带有 docker commit 的图像。这将起作用,但这是一种非常容易出错且不易复制的手工构建方法。相反,您应该利用 Dockerfile 并使用 docker build。您可以通过直接修改它的 Dockerfile 来修改您正在使用的 jenkins 镜像,也可以创建一个子镜像 FROM jenkins:latest

    修改此映像时,Jenkins 映像被配置为以用户“jenkins”的身份运行,因此您需要切换到 root 来执行应用程序安装。 “sudo”应用程序不包含在大多数图像中,但在容器外部,您可以以任何用户身份运行 docker 命令。在 cli 中,这就像 docker run -u root ... 一样简单。在您的 Dockerfile 中,您只需要在顶部添加 USER root,然后在末尾添加 USER jenkins

    最后一条建议是不要直接在 jenkins 容器上运行您的构建,而是使用您可以独立于 jenkins 容器升级的所需构建工具运行代理。它更加灵活,允许您拥有多个环境,仅使用该环境所需的工具,如果您扩大规模,您可以使用插件按需启动代理,这样您就可以使用数百个可能的代理,并且只有同时运行其中的几个。

    【讨论】:

      【解决方案2】:

      这个问题的答案在于 dcoker 容器的哲学。 Docker 容器是/应该是不可变的。因此,这是您可以尝试解决此问题的方法。

      1. 将您的基本映像(即 jenkins)作为起点。
      2. 登录此基础映像并安装 bzip2。
      3. 提交这些更改,这应该会生成一个新图像。
      4. 现在使用上面第 3 步中的图像安装任何其他软件包,例如 npm。
      5. 现在提交上图。

      注意:要以可控的方式执行命令,我总是喜欢使用这样的东西;

      docker exec -it jenkins bash

      简而言之,对您当前的两个问题的回答在于图像是不可变的,因此要进行任何将传播的更改就是提交它们并使用新创建的图像进行进一步的更改。我希望这会有所帮助。

      【讨论】:

        猜你喜欢
        • 2014-09-17
        • 2015-11-26
        • 2015-03-15
        • 1970-01-01
        • 1970-01-01
        • 2020-05-15
        • 1970-01-01
        • 2021-04-06
        • 2020-12-11
        相关资源
        最近更新 更多