Jenkins(Docker容器內)使用宿主機的docker命令

leolztang發表於2017-03-02

1、Jenkins映象

    Docker容器內的Jenkins使用容器外宿主機的Docker(即DooD,還有另外的情況就是DioD),google一下有幾種說法,但是都沒試成功(試過一種就是修改宿主機/etc/default/docker的DOCKER_OPTS配置,總是出現拒絕訪問的問題,其實就是容器的jenkins使用者沒有許可權訪問容器外的docker命令),按照大神的思路,把容器內的jenkins使用者加入到docker組中,即可成功訪問docker命令了。

  1.1 製作自定義jenkins映象

映象Dockerfile:

FROM jenkins

USER root
ARG dockerGid=999

RUN echo "docker:x:${dockerGid}:jenkins" >> /etc/group

USER jenkins

構建和啟動映象:

$ docker build . -t my-jenkins
$ docker run --name jenkins -p 7080:8080 -p 50000:50000 -v /etc/timezone:/etc/timezone -v /etc/localtime:/etc/localtime -v /var/docker_data/jenkins/jenkins_home:/var/jenkins_home -v /var/docker_data/jenkins/settings:/var/settings -v /var/run/docker.sock:/var/run/docker.sock -v $(which docker):/usr/bin/docker -d my-jenkins
注意這兩個volume引數(將jenkins容器內的docker命令指向了宿主機):
-v /var/run/docker.sock:/var/run/docker.sock
-v $(which docker):/usr/bin/docker

之後直接在jenkins的project裡面就可以使用docker命令了,比如使用maven的docker外掛打包映象。

 1.2 可能出現的問題 - 找不到某些library

    之後再另外一臺機器部署jenkins的時候發現的這個問題,就是再jenkins容器內呼叫docker命令時報錯(上一次可以是因為我裝jenkins上裝了一些外掛,這些外掛已經安裝了這些包):

docker: error while loading shared libraries: libltdl.so.7: cannot open shared object file: No such file or directory
Build step 'Execute shell' marked build as failure

    原因是jenkins容器內部沒有這個包,解決的辦法有兩個:

      1、將容器宿主機的包對映到容器內: 

#省略了其他docker執行引數,只列出了缺少的包對映volume
$ docker run --name jenkins -v /usr/lib/x86_64-linux-gnu/libltdl.so.7:/usr/lib/x86_64-linux-gnu/libltdl.so.7 -d my-jenkins

  2、對jenkins映象進行封裝,官方的jenkins映象是基於debian jessie的,dockerfile最好把源切換成國內的。Dockerfile內容如下:

FROM jenkins

USER root
#清除了基礎映象設定的源,切換成阿里雲的jessie源
RUN echo '' > /etc/apt/sources.list.d/jessie-backports.list \
  && echo "deb http://mirrors.aliyun.com/debian jessie main contrib non-free" > /etc/apt/sources.list \
  && echo "deb http://mirrors.aliyun.com/debian jessie-updates main contrib non-free" >> /etc/apt/sources.list \
  && echo "deb http://mirrors.aliyun.com/debian-security jessie/updates main contrib non-free" >> /etc/apt/sources.list
#更新源並安裝缺少的包
RUN apt-get update && apt-get install -y libltdl7

ARG dockerGid=999

RUN echo "docker:x:${dockerGid}:jenkins" >> /etc/group \
USER jenkins

 



 

相關文章