[英]Cannot install inside docker container
我在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
。
這么說,我該怎么做?
提前致謝。
這里有很多問題,但是最大的問題是您需要使用所需的工具來構建映像,而不是將其安裝在正在運行的容器中。 正如techtrainer提到的,圖像是不可變的,並且不會改變(至少從正在運行的容器中),並且容器是可拋棄的(因此,重新啟動它們時,您在其中進行的任何更改都會丟失,除非將數據存儲在容器外部的某個卷中) )。
我確實不同意techtrainer在容器中進行更改並將其提交給使用docker docker commit
的映像的觀點。 這將起作用,但這是手工構建的方法,容易出錯,並且不容易重現。 相反,您應該利用Dockerfile並使用docker docker build
。 您可以通過直接修改其Dockerfile來修改所使用的jenkins映像,也可以創建一個FROM jenkins:latest
的子映像。
修改該映像時,Jenkins映像被配置為以用戶“ jenkins”的身份運行,因此您需要切換到root用戶才能執行應用程序安裝。 大多數映像中不包含“ sudo”應用程序,但是在容器外部,您可以任何用戶身份運行docker命令。 在cli中,這就像docker run -u root ...
一樣容易。 在Dockerfile內,您只需要在頂部有一個USER root
,然后在最后需要USER jenkins
。
最后一條建議是不要直接在jenkins容器上運行構建,而要使用所需的構建工具運行代理,您可以獨立於jenkins容器進行升級。 它具有更大的靈活性,允許您僅使用該環境所需的工具即可擁有多個環境,並且如果您進行擴展,則可以使用插件按需擴展代理,因此您可能只有數百個可能要使用的代理同時運行其中幾個。
對此的答案在於dcoker容器的理念。 Docker容器是/應該是不變的。 因此,這就是您可以嘗試解決此問題的方法。
注意:為了以受控的方式執行命令,我總是喜歡使用這樣的命令;
docker exec -it詹金斯bash
簡而言之,對您當前的兩個問題的答案都在於圖像是不可變的,因此要進行將要傳播的任何更改就是提交它們並使用新創建的圖像進行進一步更改。 我希望這有幫助。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.