不能在Docker容器中安装

docker工人,我很新,但我面临一个问题,我不知道如何解决这个问题。

我有一个jenkins(docker)图像运行,一切都很好。 前几天我创build了一个工作,所以我可以每次执行pull请求时都运行nodejstesting。 作业的构build步骤之一是运行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

就这样说,我该怎么做?

提前致谢。

这里有很多问题,但最大的问题是,您需要使用所需的工具来构build映像,而不是在运行的容器内部进行安装。 正如techtrainer提到的那样,图像是不可改变的,至less不会改变(至less是从运行中的容器),容器是一次性的(所以在重新启动它们的时候,你所做的任何更改都会丢失,除非数据存储在容器外)。

我不同意techtrainer在容器中进行更改,并使用docker docker commit将它们提交给图像。 这将工作,但这是手工build立的方法,很容易出错,不容易复制。 相反,你应该利用Dockerfile并使用docker docker build 。 你可以通过直接修改它的Dockerfile来修改你正在使用的jenkins图像,或者你可以创build一个FROM jenkins:latest的子图像。

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

最后一条build议是不要直接在jenkins容器上运行你的构build,而是用你需要的构build工具运行代理,你可以独立于jenkins容器进行升级。 它更加灵活,可以让你拥有多个环境,只需要该环境所需要的工具,如果你扩展了这个环境,你可以使用一个插件按需启动代理,这样你就可以使用数百个代理同时运行一小部分。

对这个问题的回答就在于dcoker容器的理念。 Docker容器应该是不可变的。 所以,这是你可以尝试解决这个问题。

  1. 把你的基本形象,即jenkins作为起点。
  2. login到这个基础映像并安装bzip2。
  3. 提交这些更改,这应该导致一个新的形象。
  4. 现在使用第3步中的上面的图像来安装任何其他软件包,如npm。
  5. 现在提交上面的图像。

注意:为了以非常可控的方式执行命令,我总是喜欢使用类似的东西;

docker执行官 – 这jenkins bash

简而言之,回答你当前的两个问题是因为图像是不可改变的,所以任何将被传播的改变都是提交它们并使用新创build的图像做进一步的改变。 我希望这有帮助。