從Jenkins容器內部執行宿主機的docker命令

2020年7月21日14:39:29 發表評論 8,326 ℃

前提條件,docker開啟RESTful API 操作Docker的守護進程:

1、在vim /usr/lib/systemd/system/docker.service中添加如下參數

ExecStart=/usr/bin/dockerd -H tcp://0.0.0.0:2375 -H unix:///var/run/docker.sock

2、重啟docker

systemctl restart docker

3、執行curl命令測試

curl -v -X GET localhost:2375/_ping

如果使用docker容器部署的Jenkins,要在Jenkins中執行docker build 等命令,有三種方式:

第一:安裝Docker-build-step插件。但是如果是Jenkins pipeline腳本就不行了。

第二:調用docker RESTful API。可以參考docker官網https://docs.docker.com/engine/api/v1.40/#operation/ImageList

第三:把宿主的docker命令共享給容器內部使用,。

網上大部分方案都是采用第三種方式,這里也主要說下第三種方式的一些注意事項,避免采坑。

因為官網Jenkins鏡像是以Jenkins用戶運行的,所以正常共享unix文件以后,運行會提示權限不足,網上有些方案是以root用戶運行Jenkins。

還有一種方式是創建一個docker用戶組:

docker run -it -p 80:8080 -d \
-v /var/run/docker.sock:/var/run/docker.sock 
-v /usr/bin/docker:/bin/docker
-v /usr/lib64/libltdl.so.7:/usr/lib/x86_64-linux-gnu/libltdl.so.7 
-v /var/jenkins_home:/var/jenkins_home
--name jenkins
--group-add=$(stat -c %g /var/run/docker.sock)  
jenkins/jenkins:lts

如果是docker-compose運行不支持--group-add指令,需要重新build一下官網的鏡像,Dockerfile如下:

FROM jenkins/jenkins:lts
USER root
#gid=stat -c %g /var/run/docker.sock
RUN groupadd -g 994 docker &&\
    usermod -a -G docker jenkins
USER jenkins

然后執行docker build -t m.maowutv.com/jenkins:lts .

docker-compose引用新構建的鏡像,運行測試docker命令即可(親測100%正常)。

version: '3'
services:
  jenkins:
    image: m.maowutv.com/jenkins:lts
    container_name: jenkins
    restart: always
    ports:
      - '80:8080'
    volumes:
      - '/var/jenkins_home:/var/jenkins_home'
      - '/etc/localtime:/etc/localtime'
      - '/var/run/docker.sock:/var/run/docker.sock'
      - '/usr/bin/docker:/bin/docker'
      - '/usr/lib64/libltdl.so.7:/usr/lib/x86_64-linux-gnu/libltdl.so.7'
    environment:
      - "JAVA_OPTS=-Duser.timezone=Asia/Shanghai -Xms2048m -Xmx2048m -Xmn512m"
【騰訊云】云服務器、云數據庫、COS、CDN、短信等云產品特惠熱賣中

發表評論

:?: :razz: :sad: :evil: :!: :smile: :oops: :grin: :eek: :shock: :???: :cool: :lol: :mad: :twisted: :roll: :wink: :idea: :arrow: :neutral: :cry: :mrgreen: