2016-09-11 72 views
0

我在码头工作人员很新,但我遇到了一个问题,我不知道如何解决它。无法安装在码头集装箱内

我有一个詹金斯(码头)图像运行,一切都很好。几天前,我创建了一份工作,以便每次执行pull请求时都可以运行我的nodejs测试。作业的构建步骤之一是运行npm install。而工作不断得到这个错误:

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

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

就这样说,我该怎么做?

在此先感谢。

回答

0

答案就在于德克沃斯容器的哲学。 Docker容器应该是不可变的。所以,这是你可以尝试解决这个问题。

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

注意:要以受控制的方式执行命令,我总是喜欢使用类似的东西;

泊坞窗EXEC -IT詹金斯庆典

在简单地说,回答您的两个当前的问题在于一个事实,即图像是不可变的,从而做出会得到传播是提交它们,并使用新创建的图像的任何变化做出进一步的修改。我希望这有帮助。

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。建议

最后一条是不运行直接构建詹金斯容器上,而是与你的需要构建工具,你可以从詹金斯容器独立升级运行的代理。它更灵活,可以让你有只需要为环境的工具多种环境中,如果您缩放这个,你可以使用一个插件来旋转起来按需代理,所以你可以有几百种可能剂使用,只同时运行其中的一小部分。