我在码头工作时很新,但是我遇到了一个问题,我不知道如何解决它。
我有一个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
。
话虽如此,我怎么能这样做?
提前致谢。
答案 0 :(得分: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容器独立升级。它更加灵活,允许您拥有多个环境,只有该环境所需的工具,如果您扩展它,您可以使用插件按需启动代理,这样您就可以使用数百个可能的代理同时运行少数几个。
答案 1 :(得分:0)
对此的回答在于dcoker容器的理念。 Docker容器是/应该是不可变的。因此,您可以尝试解决此问题。
注意:要以很可控的方式执行命令,我总是喜欢使用类似的东西;
docker exec -it jenkins bash
简而言之,对当前两个问题的回答都在于图像是不可变的,因此要进行任何传播都是提交它们并使用新创建的图像进行进一步的更改。我希望这会有所帮助。